如何在MATLAB中将多面体分解为四面体?

时间:2009-12-03 08:42:13

标签: matlab polyhedra

我有一个多面体,有一个顶点列表(v)和曲面(s)。如何将这个多面体分解为一系列四面体?

我特别想知道是否有任何内置的MATLAB命令。

3 个答案:

答案 0 :(得分:3)

对于凸起的情况(表面中没有导致表面相互覆盖的凹痕)和三角形网格,简单的解决方案是计算多面体的中心,然后将每个面的三个角与新的中心连接起来

如果您没有三角形网格,则必须先进行三角测量。 Delaunay triangulation可能有帮助。

如果有洞或洞穴,这可能是任意复杂的。

答案 1 :(得分:3)

我不确定OP是想要'网格'(Steiner点添加)还是四面体化(分区为四面体,没有添加Steiner点)。对于凸多面体,不需要添加Steiner点(例如“中心”点)。

堆栈溢出不允许我评论gnovice的帖子(WTF,SO?),但声明“凸多面体的表面是Delaunay Tesselation中的约束”的证明相当简单:根据定义,单纯形或者subsimplex是Delaunay Tesselation中的一个成员,当且仅当存在一个n-sphere限制单点时,该单位在点集中严格不包含任何点。对于一个表面三角形,构造最小的外接球体,然后向外“向外”,远离多面体,朝向“无限”;最终它将不包含任何其他观点。 (实际上,外接球的极限是半空间;因此凸包始终是Delaunay Tesselation的一个子集。)

有关DT的更多信息,请参阅Okabe等。 al,'Spatial Tesselations'Shewchuk

中的任何论文

(我的论文是关于这些东西的,但我记得很少,而不是我应该......)

答案 2 :(得分:2)

我建议尝试使用内置函数DELAUNAY3。文档链接中给出的示例类似于Aaron's answer,因为它使用顶点加上多面体的中心点来创建3-D Delaunay曲面细分,但shabbychef指出您仍然可以创建曲面细分不包括额外的点。然后,您可以使用TETRAMESH来显示生成的四面体元素。

您的代码可能如下所示(假设v N-by-3 顶点坐标值矩阵):

v = [v; mean(v)];  %# Add an additional center point, if desired (this code
                   %#   adds the mean of the vertices)
Tes = delaunay3(v(:,1),v(:,2),v(:,3));  %# Create the triangulation
tetramesh(Tes,v);                       %# Plot the tetrahedrons

由于您在评论中说您的多面体是凸的,因此您不必担心将曲面指定为约束以进行三角测量(shabbychef似乎提供了更严格和简洁的证明这比我下面的评论那样。)

注意:根据文档,DELAUNAY3将在以后的版本中删除,DelaunayTri将有效取代它(尽管目前似乎定义约束边缘仅限于二维三角剖分)。为了完整起见,这里是你如何使用DelaunayTri并可视化凸包(即多面体表面):

DT = DelaunayTri(v);  %# Using the same variable v as above
tetramesh(DT);        %# Plot the tetrahedrons
figure;               %# Make new figure window
ch = convexHull(DT);  %# Get the convex hull
trisurf(ch,v(:,1),v(:,2),v(:,3),'FaceColor','cyan');  %# Plot the convex hull