我有一个多面体,带有顶点列表(v)和曲面列表(s)。如何将这个多面体分解成一系列四面体?
我特别想知道是否有任何内置的MATLAB命令来实现这一点。
发布于 2009-12-03 23:14:50
我建议您尝试一下内置函数DELAUNAY3。文档链接中给出的示例与Aaron's answer相似,因为它使用顶点加上多面体的中心点来创建3-D Delaunay细分,但shabbychef指出,您仍然可以在不包括额外点的情况下创建细分。然后可以使用TETRAMESH可视化生成的四面体元素。
您的代码可能如下所示(假设v是一个由顶点坐标值组成的N x 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将有效地取而代之(尽管目前似乎定义约束边仍然仅限于2-D三角剖分)。为了完整起见,下面是如何使用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-03 16:49:38
对于凸面情况(曲面上没有凹痕导致曲面相互覆盖)和三角形网格,简单的解决方案是计算多面体的中心,然后将每个面的三个角连接到新的中心。
如果没有三角形网格,则必须首先进行三角剖分。Delaunay triangulation可能会有所帮助。
如果有洞或洞,这可能是任意复杂的。
发布于 2009-12-04 01:24:20
我不确定OP是否需要“网格”(添加了Steiner点)或四面体(划分为四面体,不添加Steiner点)。对于凸多面体,增加Steiner点(例如“中心”点)是不必要的。
Stack overflow不允许我评论gnovice的帖子(WTF,所以?),但是“凸多面体的表面是Delaunay Tesselation中的约束”这句话的证明是相当简单的:根据定义,单纯形或子单纯形是Delaunay Tesselation中的成员当且仅当存在一个n-球面限定单形,该单形严格地不包含点集中的点。对于一个表面三角形,构造一个最小的外接球体,并将其向外‘吹’,远离多面体,朝向‘无穷大’;最终它将不包含任何其他点。(实际上,外接球体的极限是半空间;因此凸包始终是Delaunay Tesselation的子集。)
有关DT的更多信息,请参见Okabe,et。al、'Spatial Tesselations'或Shewchuk的任何论文
(我的论文是关于这个东西的,但我记得的比我应该记得的要少……)
https://stackoverflow.com/questions/1838537
复制相似问题