我有一个与之前提出的问题类似的问题,除了 3D 之外,我只需要体积,而不需要船体的实际形状。
更准确地说,我得到了 3D 中的一小组点(例如,10-15),所有这些点都位于点集的凸包上(因此它们都“重要”并定义了包)。我只想计算船体的体积,我不关心计算实际的多面体。有没有一种有效的算法来做到这一点?
我有一个与之前提出的问题类似的问题,除了 3D 之外,我只需要体积,而不需要船体的实际形状。
更准确地说,我得到了 3D 中的一小组点(例如,10-15),所有这些点都位于点集的凸包上(因此它们都“重要”并定义了包)。我只想计算船体的体积,我不关心计算实际的多面体。有没有一种有效的算法来做到这一点?
如果您能击败曹书豪的建议,我会感到惊讶:计算船体,然后在对船体进行三角剖分后计算体积。你可以用增量算法,或礼品包装算法。如果你真的想要简单的代码,你可以简单地写一个遍历所有可能的三角形,看看它们是否在船体上。为了,这仍然相当快,并且您可以轻松实现快捷方式。一旦你有了所有的三角形面,然后选择一个顶点并用每个三角形制作一个四面体和. 它的体积是顶点坐标的行列式。
MATLAB中的一个小测试,用于顶点数, 每个分量都是一个统一的随机数:
N = 100;
p=rand(N,3);
tic;
T = delaunayTri(p(:,1),p(:,2),p(:,3));
t = T.Triangulation;
e1 = p(t(:,2),:)-p(t(:,1),:);
e2 = p(t(:,3),:)-p(t(:,1),:);
e3 = p(t(:,4),:)-p(t(:,1),:);
V = abs(dot(cross(e1,e2,2),e3,2))/6;
Vol = sum(V);
time_elapse = toc;
结果:
time_elapse =
0.014807
Vol =
0.67880219135839
我会说它相当快,如果你想运行它次,只需要不到3个小时。这是它的样子:
另外我想提一下,在 O'Rourke 教授的帖子中,他提到使用行列式计算四面体的体积,但在这里我更喜欢使用三重乘积。它是一种自然的向量化操作,比行列式的内置例程更具可扩展性(或者您可以扩展手动行列式:p)。这是另一个测试,结果是
time_elapse =
3.244278
Vol =
0.998068316875714
有四面体数. 请注意,总成交量非常接近因为有太多的点聚集在.
来自 Komei Fukuda 的多面体计算常见问题解答:
2.23 是否有任何有效的算法来计算凸多面体的体积?
众所周知,计算 V-polytope(或 H-polytope)的体积是#P-hard,参见 [DF88] 和 [Kha93]。理论上有有效的随机算法来近似凸体的体积[LS93],但似乎没有实现。对凸多面体的各种体积计算算法进行了比较研究[BEF00]。这表明没有一种算法可以很好地适用于许多不同类型的多面体。
[DF88] ME Dyer 和 AM Frieze。计算多面体体积的复杂性。暹罗学家计算机。, 17:967-974, 1988。
[Kha93] LG 卡奇扬。多面体体积计算的复杂性。在 J. Pach,编辑,离散和计算几何的新趋势,第 91-101 页。施普林格出版社,柏林,1993 年。
[LS93] L. Lovasz 和 M. Simonovits。凸体中的随机游走和改进的体积算法。 随机结构和算法,4:359-412,1993。
[BEF00] B. Bueler、A. Enge 和 K. Fukuda。凸多面体的精确体积计算:一项实际研究。G. Kalai 和 GM Ziegler,编辑,Polytopes - Combinatorics and Computation,DMV-Seminar 29,第 131-154 页。伯克豪瑟,2000。
尽管 Dyer 和 Frieze 论文的标题如此,这似乎将 3D 问题的细节隐藏在更高维度的困难中。从他们的摘要中:“我们表明,计算多面体的体积,无论是作为一个面列表还是一个顶点列表,都与计算矩阵的永久值一样困难。”
Jim Lawrence 1991 年的一篇论文Polytope Volume Computation可以在线阅读,其中有一些针对特定 3D 案例的参考资料。他写道:“本文中的方法避免了三角测量或其边界。”此外,该论文中描述的算法似乎适合您的情况,因为它表示“作为数字的总和, 每个顶点一个的. 这些数字很容易计算,所以程序的难点主要是枚举。”在你的情况下,困难可能转化为找到一个表达作为线性不等式系统的解.
如果您已经知道这样的“半空间相交”表达式,那么也许它会允许相当快的计算。