我有一个多面体,有一个顶点列表 ( v
) 和曲面 ( s
)。如何将这个多面体分解成一系列四面体?
我特别想知道是否有任何内置的 MATLAB 命令。
对于凸面情况(表面没有凹痕导致表面相互覆盖)和三角形网格,简单的解决方案是计算多面体的中心,然后将每个面的三个角与新的中心连接起来。
如果您没有三角形网格,那么您必须首先进行三角测量。Delaunay三角测量可能会有所帮助。
如果有洞或洞穴,这可以任意复杂。
我不确定 OP 想要一个“网格”(添加了施泰纳点)或四面体化(划分为四面体,没有添加施泰纳点)。对于凸多面体,不需要添加施泰纳点(例如“中心”点)。
堆栈溢出不允许我评论 gnovice 的帖子(WTF,SO?),但是“凸多面体的表面是 Delaunay Tesselation 中的约束”语句的证明相当简单:根据定义,单纯形或子单纯形是Delaunay Tesselation 中的一个成员当且仅当存在一个限制单纯形的 n 球体,该单纯形体在点集中严格不包含任何点。对于曲面三角形,构造最小的外接球体,并将其向外“膨胀”,远离多面体,朝向“无穷大”;最终它将不包含其他点。(事实上,外接球体的极限是半空间;因此凸包始终是 Delaunay Tesselation 的子集。)
有关 DT 的更多信息,请参见 Okabe 等。al,“空间镶嵌”,或Shewchuk的任何论文
(我的论文是关于这些东西的,但我记得的比我应该的要少……)
我建议尝试内置函数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