1.前言
面积和体积的计算是常见和基础的几何算法话题,面积和体积通常作为面或构件的基本信息参与相关的建模、计算、分析等过程。
有关面积的计算,可以参考博主此前的文章,
一种误差较小的轮廓面积计算算法_轮廓面积计算原理-CSDN博客文章浏览阅读920次,点赞18次,收藏19次。基于微分思想的轮廓面积计算方法之一是将多边形轮廓边与X轴会Y轴进行围合,形成一个个梯形,每个梯形的面积有符号,累计求和即得到多边形轮廓的面积。详见博主之前的文章,记录导致计算轮廓面积出错的一个坑点-CSDN博客计算轮廓面积是常见的几何算法话题,获取轮廓面积、计算轮廓法线等场景会涉及到。计算轮廓面积的方法有很多,一种常用的是微积分思路的分段求和办法,即组成轮廓的每条线段与X轴或Y轴进行有向投影,轮廓边线与X轴或Y轴的投影之和即为轮廓的有向面积。_轮廓面积计算原理https://blog.csdn.net/baidu_38621657/article/details/141868522
本文对实体体积计算算法进行说明。
2.内容
实体体积计算方法不唯一,如微积分、投影求和、公式推导应用等方式,其实很多方式的原始思维是一样的,即来源于微分和积分思路,通过公式推导简化计算逻辑,提高计算效率。
其中,
公式如上,解释如下,
- Si为构成实体的面;
- ni为面的法向;
- P0,i为面上任意一点;
- ci为面所在平面的参数,即面所在平面到原点(0,0,0)的距离;
- Area(Si)为面的面积,该面积为基于法向ni的面积,如果ni为面法向,则面积符号为正,如果ni为面法向对向,则面积为负,其实这里ni为法向或法向的对向不影响结果,但不能为任意方向,那样,结果数值会错误。
- ci * Area(Si)为平面到原点构成的拉伸体的体积;
- 整个公式的解释就清楚了吧,不清楚可以关注博主公众号留言;
3.公式推导
其实体积计算可以由面积计算扩展而来,实体各个面对某一平面(通常为XY、YZ或ZX平面)投影所围成区域有符号体积之和即为实体的体积。
上述解释也可以作为求体积的一种方法,不过稍微复杂了点,毕竟当碰到顶面倾斜的直纹体的体积计算话题时,没有什么人会感觉到十分轻松。
我们继续推导,
- 面Si在空间的三个正交平面均有分量:Si_x、Si_y、Si_z;
- Si在某空间平面的投影等价于其在此平面的分量在此平面的投影,此处的投影可扩展为所围成的空间区域;如Si在XY平面的投影等于Si_z在XY平面的投影;
- Ci为原点到面Si所在平面的距离,同样,Ci由三个分量:Ci_x、Ci_y、Ci_z;
- Si在XY平面的投影区域体积为Si*Ci_z=Si_z*Ci_z,这里的Si和Ci_z均为向量,结果为数值;同理可求Si在YZ、ZX平面投影区域的体积;
- Si在空间三个正交平面投影区域体积之和为:Si*(Ci_x+Ci_y+Ci_z) = Si*Ci;
- 上述提到过构成实体的面在空间某平面投影所形成区域体积之和为实体体积,可进一步得知,构成实体的面在空间三个正交平面投影之和的之和为3倍的实体体积,如公式所示;
- 为什么不直接求1倍的体积呢?因为实体时三维空间中的元素,根据上述思路,3倍体积公式得到了简化,容易求解,将结果除以3即得到实体体积。
4.效果
代码就不上传了,上述思路和公式是准确的,可自行实现,感兴趣可进一步联系博主。
经单元测试验证,各种情况下均通过单元测试,一个领域问题是浮点运算会带来误差,减少误差的话题可参考博主此前文章,
关于float浮点值二进制存储和运算精度损失的话题_float的二进制存储和输出-CSDN博客文章浏览阅读1.1k次,点赞8次,收藏18次。浮点值的存储、运算都可能会带来精度损失,了解精度损失背后的机制原因方便我们更好的了解什么情况下会发生精度损失、什么情况下精度损失较大,以及思考怎么避免或减少精度损失。_float的二进制存储和输出https://blog.csdn.net/baidu_38621657/article/details/141027014
5.写在后面
图形几何、数据处理、并行计算相关研究和研发,公众号:geometrylib,欢迎交流。
_________哈市雪花__________