场景:容器中存放液体,需要根据雷达测量出的液位计算出容器内的液体体积。
数据:扫描仪扫描容器生成STL文件。
效果图

处理关键代码:
数据结构

/// <summary>
/// 顶点数据结构
/// </summary>
public class Point3
{public Point3(){}public Point3(float x = 0, float y = 0, float z = 0){X = x;Y = y;Z = z;}public float X { get; set; }public float Y { get; set; }public float Z { get; set; }
}
/// <summary>
/// 三角面数据结构
/// </summary>
public class Face
{/// <summary>/// 法矢量/// </summary>public Point3 Vector { get; set; }public Point3 P1 { get; set; }public Point3 P2 { get; set; }public Point3 P3 { get; set; }/// <summary>/// 三角面片的属性信息/// </summary>public short Attribute { get; set; }}

全局变量

 /// <summary>/// 三角面集合/// </summary>
private List<Face> Faces { get; set; }

读取二进制STL文件

byte[] b = null;
try
{DtStart = DateTime.Now;using (var fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read)){var length = (int)fs.Length;b = new byte[length];fs.Read(b, 0, length);fs.Close();}}
catch (Exception e)
{b = null;AddLog(e.Message);MessageBox.Show(e.Message);
}

解析三角面数据

if (b == null) return;
var count = BitConverter.ToInt32(b, 80);
for (int i = 0; i < count; i++)
{var vx = BitConverter.ToSingle(b, i * 50 + 84);var vy = BitConverter.ToSingle(b, i * 50 + 88);var vz = BitConverter.ToSingle(b, i * 50 + 92);var x1 = BitConverter.ToSingle(b, i * 50 + 96);var y1 = BitConverter.ToSingle(b, i * 50 + 100);var z1 = BitConverter.ToSingle(b, i * 50 + 104);var x2 = BitConverter.ToSingle(b, i * 50 + 108);var y2 = BitConverter.ToSingle(b, i * 50 + 112);var z2 = BitConverter.ToSingle(b, i * 50 + 116);var x3 = BitConverter.ToSingle(b, i * 50 + 120);var y3 = BitConverter.ToSingle(b, i * 50 + 124);var z3 = BitConverter.ToSingle(b, i * 50 + 128);var at = BitConverter.ToInt16(b, i * 50 + 132);var face = new Face{Vector = new Point3(vx, vy, vz),P1 = new Point3(x1, y1, z1),P2 = new Point3(x2, y2, z2),P3 = new Point3(x3, y3, z3),Attribute = at};Faces.Add(face);
}

计算体积和面积

private void Calc()
{var v = 0d;var s = 0d;foreach (var f in Faces){v += TriangularVolume(f.P1.X, f.P1.Y, f.P1.Z,f.P2.X, f.P2.Y, f.P2.Z,f.P3.X, f.P3.Y, f.P3.Z);s += TriangularArea(f.P1.X, f.P1.Y, f.P1.Z,f.P2.X, f.P2.Y, f.P2.Z,f.P3.X, f.P3.Y, f.P3.Z);}labelControl1.Text = $@"面积:{(s / 100):F3} cm2{Environment.NewLine}体积:{(v / 1000):F3} cm3";}/// <summary>/// 计算体积/// </summary>private double TriangularVolume(float p1X, float p1Y, float p1Z,float p2X, float p2Y, float p2Z,float p3X, float p3Y, float p3Z){double v321 = p3X * p2Y * p1Z;double v231 = p2X * p3Y * p1Z;double v312 = p3X * p1Y * p2Z;double v132 = p1X * p3Y * p2Z;double v213 = p2X * p1Y * p3Z;double v123 = p1X * p2Y * p3Z;return (double)(1.0 / 6.0) * (-v321 + v231 + v312 - v132 - v213 + v123);}/// <summary>/// 计算面积/// </summary>private double TriangularArea(float p1X, float p1Y, float p1Z,float p2X, float p2Y, float p2Z,float p3X, float p3Y, float p3Z){double ax = p2X - p1X;double ay = p2Y - p1Y;double az = p2Z - p1Z;double bx = p3X - p1X;double by = p3Y - p1Y;double bz = p3Z - p1Z;double cx = ay * bz - az * by;double cy = az * bx - ax * bz;double cz = ax * by - ay * bx;return (double)(0.5 * Math.Sqrt(cx * cx + cy * cy + cz * cz));}

对面数据排序

Faces.Sort(((a, b) => b.P1.Z.CompareTo(a.P1.Z)));

UpDown控制步进计算不同高度体积

try
{if (Faces == null || Faces.Count == 0) return;var t1 = DateTime.Now;var spinValue = (float)spinEdit1.Value;var v = 0d;foreach (var f in Faces){if (f.P1.Z <= spinValue){v += TriangularVolume(f.P1.X, f.P1.Y, f.P1.Z,f.P2.X, f.P2.Y, f.P2.Z,f.P3.X, f.P3.Y, f.P3.Z);}}var t2 = (DateTime.Now - t1).TotalMilliseconds;labelControl2.Text = $@"体积:{(v / 1000):F3} cm3 {Environment.NewLine}用时:{t2} ms";}catch (Exception exception){Console.WriteLine(exception);MessageBox.Show(exception.Message);}

源码:

https://download.csdn.net/download/songlinok/70112610

【无标题】二进制STL文件解析 计算面积和体积与根据高度计算部分体积相关推荐

  1. C++/Qt读取二进制STL文件

    C++/Qt读取二进制STL文件 STL文件结构(没必要看) C++版本 QT版本 STL文件结构(没必要看) 二进制STL文件用固定的字节数来给出三角面片的几何信息. [80]80个字节的文件头,用 ...

  2. Java设计一个类代表二维空间的一个点,设计一个类代表二维空间的一个圆,计算面积,,并写程序验证计算一个点(Point对象)是否在圆(Cricle对象)内

    题目要求: (1) 设计一个类代表二维空间的一个点 (2) 设计一个类代表二维空间的一个圆.要求两个成员变量.一个是圆心,一 个是半径,提供计算面积的方法. (3) 为上述Cricle类添加一个方法, ...

  3. Android逆向:二进制xml文件解析 之 Start Tag Chunk

    目录 1.xml结构 2.Start Tag Chunk Header 3.Start Tag Chunk Body 4.Atrributes 5.总结 在Android中,xml文件经过编译后都是不 ...

  4. 【无标题】常见文件扩展名(后缀)及其对应文件类型和功能

    Windows/linux通过文件的后缀名来区分各种不同的文件,同种类型的文件可以使用相同的文件后缀名也称文件的扩展名,本质或者说差异所在是文件根据后缀区分文件属性和存储格式,不同的文件类型就像不同的 ...

  5. 【无标题】FTP文件夹错误:打开FTP服务器上的文件夹时发生错误。请检查是否有权限访问该文件夹。

    问题描述:通过我的电脑或资源管理器连接FTP服务器时提示"FTP文件夹错误:打开FTP服务器上的文件夹时发生错误.请检查是否有权限访问该文件夹.详细信息:The operation time ...

  6. 多边形交叉区域计算面积_使用GPC或Clipper计算多边形交叉区域

    在Angus的Clipper与其他库的基准测试中,他有一个多边形区域计算方法 . 我用它并修改了他的椭圆方法 . 结果如下: void Ellipse2Poly(double theta, doubl ...

  7. 如何读取STL文件?

    STL文件有两种文件格式,分别是二进制的stl和Ascii格式的stl.下面将针对这文件的两个格式,用C语言分别写出一段简单的示例代码. 一.读取二进制的STL文件 (1)二进制stl文件的结构 文件 ...

  8. stl文件介绍及读取

    STL文件规则 (1)共顶点规则 每一个三角面片必须与其相邻的每一个面片共两个顶点 ,即一个三角面片的顶点不能落在相邻的任何三角面片的边上; (2)取向规则 单个面片法向量符合右手法(ccw)则且其法 ...

  9. stl格式说明和stl文件生成(ascII,binary),vs2005,文件生成后imageware读取成功

    转自:http://blog.csdn.net/scudz/article/details/7758141 1引言 STL(Stereo lithographic)文件格式是美国3D SYSTEMS公 ...

  10. Matlab读取并输出stl文件

    *#利用matlab读取stl文件后,将其中三角形片数据×2后,保存到另一个stl文件,利用3D软件打开观察图形是否变为两倍.那么应该怎么做呢? 首先了解一下stl文件 STL(Stereo lith ...

最新文章

  1. 什么是java四大引用?
  2. C#多线程与UI响应 防止界面假死不响应(子线程创建的窗体获取消息响应用Application.DoEvent )
  3. .NetCore从零开始使用Skywalking分布式追踪系统
  4. 如何用区块链保障数据安全和承载数据确权
  5. 针对 自制Windows Mobile 文件浏览器的改进
  6. excel函数学习系列一
  7. 基于Java的Heritrix爬取网页
  8. matlab 声纹识别,识别模型论文,关于基于MATLAB的声纹识别系统软件的设计相关参考文献资料-免费论文范文...
  9. python题目58:工厂流水线调度
  10. 查看linux系统有哪些登陆用户,Linux_linux查看系统登录用户,Last login: Wed Jul 29 17:16:10 2009 fro - phpStudy...
  11. UE4_Stereo Panoramic Movie Capture_合并左右眼为一张图片
  12. landsat8 编辑头文件信息
  13. 史上最全的15个苹果手机输入法使用技巧,不看后悔三年
  14. Linux操作系统各发行版ISO镜像下载
  15. 谢希仁计算机网络第7版考研真题章节题库下载
  16. Robomongo 的安装
  17. 关于vue2与vue3
  18. python获取当前时间戳_如何在Python中获取当前时间戳?
  19. 云技术在计算机行业怎么样,计算机云计算技术论文
  20. 安卓去除虚拟按键(home键,返回键,列表键)

热门文章

  1. linux文件类型elf,Linux下ELF文件的格式(1)
  2. vue 页脚_前端必懂之Sticky Footer(粘性页脚)
  3. Windows10家庭版 Windows defender 安全中心显示 页面不可用
  4. nx.adjacency_matrix计算邻接矩阵与真实结果不一致:解决办法记录
  5. 微信小程序图片懒加载插件
  6. 苹果cms新手快速入门常见问题汇总及解决教程
  7. PL330 DMAC笔记(1) - 简介
  8. 全开源即时通讯(IM)系统 高仿微信
  9. PDF压缩文件怎么压缩最小?用迅读PDF大师,一键无损压缩
  10. 老男孩教育33期周末班-决心书