封闭几何体体积计算总结
这里将会介绍三种基于封闭几何体的体积计算方法,这三种方法均为准确的封闭体计算方法。
1、四面体法
下图是一个空间中封闭的结合体三角网格:
这里我们的计算想法是,在空间中任取一点,与每个三角面顶点连线可以构成一些四面体,如下图:
然后可以根据法向量,将其中背离空间点的面法矢(绿色)构成的体积(蓝色)减去指向空间点的面法矢(红色)构成的体积(黄色),可以得到封闭几何体体积。
如下图,每个四面体都可以由三角面片与空间点O构成:
四面体体积计算可以由以下式子得到:
即=|(AB×BC)·OA|/6
其中向量AB×向量BC得到的是三角面ABC的法矢,长度为三角形ABC的2倍。再与OA内积相当于OA折射到垂直于面ABC的长度,相当于四面体高。因此可得到四面体体积。
单位四面体体积有了,现在我们需要确定哪些四面体累加,哪些累减。
我们发现,当我们有了面法矢之后,就可以通过法矢与空间点O之间的关系得知其加减。
而向量AB×向量BC是保留其法矢方向信息的,且三角形ABC点排列顺序可以决定最后其法矢的方向,因此我们需要三秒面中的点按照相同方式排列,如下图:
文章:efficient feature extraction for 2D3D objects in mesh representation. 2002 中说明,接壤三角面只要保证其共同边的方向相反就可以使所有三角面法矢指向同一面。
由此我们可实现体积计算。
该方法通常在计算累计结果之后取其绝对值,以防止三角形顶点排序方向与预期相反。
2、三棱柱法
类似于四面体法,三棱柱法也是用了累计的方法来计算体积,只不过四面体选取的是空间中一个面,如下图所示:
理所应当这里计算的是该三棱柱体积。同样也是用了累加和累减的方式来计算封闭几何体体积。
上图所示,四棱柱体体积可以得到如下结果:
Vi= (h1+h2+h3)·SAoBoCo/3
公式可以推理出来,如下图所示:
如上图所示,我们将三棱柱分割成三个区域。我们可以得知四面体A0B0C0-B的体积为SA0B0C0*BB0*1/3。
而四面体A0B0C0-B与四面体C0BC-A0体积比可以看作CC0:BB0。同理可以得到A0AC-B体积。
这里三角面法矢也类同于四面体法中的计算方法,不赘述。
3、散度理论法
参考文章:Evaluation of new algorithms for the interactive measurement of surface area and volume. 1994
这种方法其主要思路如下,首先确定一个MUNC(maximum unit normal component)。
其公式如下:
其中Δx、Δy、Δz是体素的三个方向的单位长度,如下图:
nzi等为单位法向量在z轴分量,以此类推。所以Δai是在发向在延轴分量最大情况下计算得到的单位表面。其本质上就是单位表面映射到地面的面积为单位体素面积。这里之所以选择最大值,可能是考虑到有时候发向分量为0的情况。
因此可以计算几何体表面积:
同样可以计算其体积:
其中xi等为单位表面的重心高度,nzi为法向延轴分量,求和即为单位表面对应的棱柱的体积。然后kx-kz为面法矢分量的MUNC的单位体素占所有含表面体素的比例。vtk库使用的就是这种体积计算方法。