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


11

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

更精确地讲,我在3D中得到了一小部分点(例如10-15),已知所有这些点都位于点集的凸包上(因此它们都“重要”并定义了壳)。我只想计算船体的体积,我不在乎计算实际的多面体。有一种有效的算法可以做到这一点吗?


您知道这些点是多面体的顶点。您知道面孔(船体上的多边形)吗?如果是这样,您可以相当轻松地计算体积(作为“圆锥”体积的总和)。
hardmath

1
懒惰的方法是先进行三角剖分,然后将四面体的体积加起来(非常容易计算)。
曹树浩

@hardmath:不。我知道,如果我知道刻面形状,那会很容易。
维克多·刘

@Shuhao Cao:对于这种特殊情况,是否有简单的三角剖分算法?通常,3D四面体化算法非常复杂,我希望需要解决数千或数百万次此问题。
维克多·刘

Answers:


5

如果您能击败曹书豪的建议,我会感到惊讶:计算船体,然后对船体进行三角剖分,然后计算体积。您可以使用增量算法或礼物包装算法来计算船体。如果您真的想要简单的代码,则可以在所有可能的三角形上编写一个n 4循环,以查看它们是否在船体上。对于n = 15,这仍然非常快,您可以轻松实现快捷方式。拥有所有三角形面后,选择一个顶点v,并为每个三角形Tv制作一个四面体。它的体积是4 ×Øñ2ñ4ñ=15vŤv顶点坐标中的 4个行列式。4×4


2

一个小的测试在MATLAB,为顶点的数目,每个组件是在一个均匀随机数[ 0 1 ]ñ=100[01个]

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个小时。这是什么样的:106

康维尔

4×4ñ=105

time_elapse =
              3.244278
Vol =
     0.998068316875714

7×1051个[01个]3


顺便说一句,测试是在我的旧版2007 Core 2 T61p上完成的。

2

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

[Rd

众所周知,计算V型多态性(或H型多态性)的体积是#P困难的,请参见[DF88]和[Kha93]。有理论上有效的随机算法来近似凸体的体积[LS93],但似乎没有可用的实现方法。对凸多面体的各种体积计算算法进行了比较研究[BEF00]。这表明没有一种算法可以很好地适用于许多不同类型的多表位。

[DF88] ME Dyer和AM Frieze。计算多面体的体积的复杂性。SIAM J.计算。,1988:17:967-974。

[Kha93] LG Khachiyan。多面体体积计算的复杂性。在J. Pach(《离散和计算几何的新趋势》,第91-101页)的编辑中。柏林,Springer Verlag,1993年。

[LS93] L. Lovasz和M. Simonovits。随机游走在凸体中,并改进了体积算法。 随机结构与算法,4:359-412,1993。

[BEF00] B. Bueler,A。Enge和K. Fukuda。凸多面体的精确体积计算:一项实际研究。在G. Kalai和GM Ziegler中,《多面体-组合与计算》的编辑,DMV研讨会29,第131-154页。Birkhauser,2000年。

尽管Dyer和Frieze论文的标题如此,这似乎将3D问题的细节掩埋在更高维度的难题之中。从他们的摘要中可以得出:“我们表明,计算以面列表或顶点列表形式给出的多面体的体积与计算矩阵的永久性一样困难。”

PPñvvPPPP={X[R3一个Xb}

P

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.