在MATLAB中计算网格对象的体积

时间:2016-03-02 00:35:56

标签: matlab 3d mesh

我正在使用geom3d来建模3D几何形状。具体来说,我有兴趣用任意平面切片后计算椭圆体的体积。我使用以下代码(为简单起见,我将使用一个球体并将其切割在中心)。

<% if task.user_id == current_user.id %>
   <-- stuff you want to show the assigned user -->
<% else %>
   <-- stuff you want to show everyone else -->
<% end %>

按预期计算球体的体积(4/3 * pi)。

现在,我把它切成两半。

[x, y, z] = sphere(30);
[f, v, c] = surf2patch(x, y, z, z, 'triangles');
meshVolume(v, f)

现在,如果我计算音量,我会得到不正确的值(明显小于初始音量的一半)。

P = createPlane([0, 0, 0], [0, 0, 1]);
[v1 f1] = clipConvexPolyhedronHP(v, f, P);
drawMesh(v1, f1, 'facealpha', 0.5)

错误结果的原因是什么?

2 个答案:

答案 0 :(得分:2)

(我已经在Mathworks File Exchange页面上回答了,但我认为将它放在这里也很有用)

使用没有&#39; abs&#39;的决定因素是计算网格体积的正确方法。通过这种方式,您可以处理非凸网格,甚至是带孔的多面体。但是网格的面必须一致(通常在网格外部)。 类似的主题是given here

使用行列式的绝对值将仅为凸多面体提供正确的结果。因此,我只会将其用作特定应用程序的快速入侵。

关于原始问题,在剪裁网格的计算中存在错误,导致面朝向不一致,因此导致错误的结果。我已经更新了它,所以它应该会有更好的结果。

(注意:我是geom3d软件包的作者)

答案 1 :(得分:0)

实际上在meshVolume函数的实现中发现了一个错误。 该函数将体积划分为四面体,四面体是具有4个顶点,6个边和4个三角形面的三维实体。 然后,身体的总体积是所有四面体体积的总和。 代码通过计算顶点的行列式来计算体积。

vols(i) = det(tetra) / 6;

事实证明,由于行的不同顺序(顶点坐标),有时这个行列式可能是负的。

正确的公式应包括行列式的绝对值。

vols(i) = abs(det(tetra) / 6);

解决了这个问题。我已在geom3d网页上报告了该错误。

有关四面体的详细信息,请参阅here