【问题标题】:Calculating a volume of a mesh object in MATLAB在 MATLAB 中计算网格对象的体积
【发布时间】:2016-03-02 00:35:56
【问题描述】:

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

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

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

现在,我把它切成两半。

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

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

 meshVolume(v1, f1)

结果不正确的原因是什么?

【问题讨论】:

    标签: matlab 3d mesh


    【解决方案1】:

    (我已经在 Mathworks 文件交换页面上回答过,但我认为把它也放在这里会很有用)

    使用不带“abs”的行列式是计算网格体积的正确方法。通过这样做,您可以处理非凸网格,甚至是带孔的多面体。但是网格的面必须始终如一地定向(通常在网格外面)。 一个类似的话题是given here

    使用行列式的绝对值只会对凸多面体给出正确的结果。所以我只会将它用作特定应用程序的快速破解。

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

    (注:我是geom3d包的作者)

    【讨论】:

      【解决方案2】:

      其实在meshVolume函数的实现中发现了一个bug。 该函数将体积分成四面体,四面体是具有 4 个顶点、6 条边和 4 个三角形面的 3 维实体。 那么物体的总体积就是所有四面体的体积之和。 代码通过计算顶点的行列式来计算体积。

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-04
        相关资源
        最近更新 更多