小点的3D凸包体积全部设置在包体上

计算科学 算法 参考请求 计算几何
2021-12-08 04:13:02

我有一个与之前提出的问题类似的问题,除了 3D 之外,我只需要体积,而不需要船体的实际形状。

更准确地说,我得到了 3D 中的一小组点(例如,10-15),所有这些点都位于点集的凸包上(因此它们都“重要”并定义了包)。我只想计算船体的体积,我不关心计算实际的多面体。有没有一种有效的算法来做到这一点?

3个回答

如果您能击败曹书豪的建议,我会感到惊讶:计算船体,然后在对船体进行三角剖分后计算体积。你可以用O(n2)增量算法,或礼品包装算法。如果你真的想要简单的代码,你可以简单地写一个n4遍历所有可能的三角形,看看它们是否在船体上。为了n=15,这仍然相当快,并且您可以轻松实现快捷方式。一旦你有了所有的三角形面,然后选择一个顶点v并用每个三角形制作一个四面体Tv. 它的体积是4×4顶点坐标的行列式。

MATLAB中的一个小测试,用于顶点数N=100, 每个分量都是一个统一的随机数[0,1]

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

我会说它相当快,如果你想运行它106次,只需要不到3个小时。这是它的样子:

卷积

另外我想提一下,在 O'Rourke 教授的帖子中,他提到使用行列式计算四面体的体积,但在这里我更喜欢使用三重乘积。它是一种自然的向量化操作,比行列式的内置例程更具可扩展性(或者您可以扩展4×4手动行列式:p)。这是另一个测试N=105,结果是

time_elapse =
              3.244278
Vol =
     0.998068316875714

有四面体数7×105. 请注意,总成交量非常接近1因为有太多的点聚集在[0,1]3.

来自 Komei Fukuda 的多面体计算常见问题解答

2.23 是否有任何有效的算法来计算凸多面体的体积Rd?

众所周知,计算 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 案例的参考资料。他写道:“本文中的方法避免了三角测量P或其边界。”此外,该论文中描述的算法似乎适合您的情况,因为它表示“P作为数字的总和Nv, 每个顶点一个vP. 这些数字很容易计算,所以程序的难点主要是枚举P。”在你的情况下,困难可能转化为找到一个表达P作为线性不等式系统的解P={xR3:Axb}.

如果您已经知道这样的“半空间相交”表达式P,那么也许它会允许相当快的计算。