给定多边形和固定点,找到三角网格

时间:2010-12-27 07:17:08

标签: matlab

假设我有一个多边形,我想对它进行网格划分。为了进一步对我得到的网格设置约束,我将提供一个固定点列表(必须位于多边形内),以便它们必须通过生成的三角形元素连接。

执行此操作的matlab命令是什么?我尝试了delaunay命令,但它无法在凹多边形上工作,因为delaunay命令将始终返回一个包含凸区域的元素列表。

1 个答案:

答案 0 :(得分:5)

您要使用的功能是DelaunayTri,您可以按照以下步骤操作:

  • 创建多边形中的边缘点列表。
  • 获取多边形的所有顶点,并将它们与要包含在多边形内的其他固定点组合。
  • 创建受约束的三角测量(正如我在其他答案[{3}}和here中所说明的那样)。
  • 如您所述,这将创建凸包的三角剖分(即使您有凹多边形),因此您必须使用方法here删除约束边之外的三角形(也在以上链接的答案。)

以下是一些示例代码:

polygonVertices = [0 0;...  %# Concave polygon vertices
                   0 1;...
                   1 1;...
                   0.5 0.5;...
                   1 0];
polygonEdges = [1 2;...  %# Polygon edges (indices of connected vertices)
                2 3;...
                3 4;...
                4 5;...
                5 1];
otherVertices = [0.5.*rand(5,1) rand(5,1)];   %# Additional vertices to be added
                                              %#   inside the polygon
vertices = [polygonVertices; otherVertices];  %# Collect all the vertices
dt = DelaunayTri(vertices,polygonEdges);  %# Create a constrained triangulation
isInside = inOutStatus(dt);  %# Find the indices of inside triangles
faces = dt(isInside,:);      %# Get the face indices of the inside triangles

现在变量facesvertices可用于inOutStatus


使用旧版本的MATLAB ...

查看plot the meshed polygon注意:需要MathWorks帐户才能执行此操作),可以看到archived version documentation首次出现在版本7.8.0(2009a)中。在此之前,可用于执行2-D Delaunay三角剖分的唯一内置函数是DelaunayTri,它基于delaunay,因此无法支持非凸面的约束三角剖分或三角剖分。

较新的Qhull使用DelaunayTri。因此,对于早于7.8.0的版本的用户,一个选项是CGAL来连接MATLAB中的CGAL例程。例如,如果您要对凹面多边形进行三角剖分,则可以创建一个MEX文件来连接create MEX-files之一,以便将凹多边形分解为一组凸多边形。然后convex partitioning routines in CGAL可用于对每个凸多边形进行三角测量,最后一组三角测量分组为凹多边形的一个较大的三角剖分。