3

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

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

4

3 回答 3

3

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

如果您没有三角形网格,那么您必须首先进行三角测量。Delaunay三角测量可能会有所帮助。

如果有洞或洞穴,这可以任意复杂。

于 2009-12-03T08:49:37.577 回答
3

我不确定 OP 想要一个“网格”(添加了施泰纳点)或四面体化(划分为四面体,没有添加施泰纳点)。对于凸多面体,不需要添加施泰纳点(例如“中心”点)。

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

有关 DT 的更多信息,请参见 Okabe 等。al,“空间镶嵌”,或Shewchuk的任何论文

(我的论文是关于这些东西的,但我记得的比我应该的要少……)

于 2009-12-03T17:24:20.343 回答
2

我建议尝试内置函数DELAUNAY3。文档链接中给出的示例类似于Aaron 的答案,因为它使用顶点加上多面体的中心点来创建 3-D Delaunay 镶嵌,但shabbychef指出您仍然可以在不包括额外点的情况下创建镶嵌。然后,您可以使用TETRAMESH可视化生成的四面体元素。

您的代码可能看起来像这样(假设v是一个N×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
于 2009-12-03T15:14:50.263 回答