文档

创建和编辑德劳内三角剖

这个例子显示了如何创建、编辑和查询使用delaunayTriangulation类德劳内三角剖。德劳内三角测量是使用最广泛的三角测量在科学计算。与三角相关联的属性提供一个解决各种几何问题的基础。限制德劳内三角剖分的建设也显示,连同一个应用程序覆盖内侧轴计算和网格变形。

示例一:创建和绘制2 d德劳内三角测量

这个例子向您展示了如何计算一个二维德劳内三角以及如何画出三角顶点和三角形标签。

x =兰德(10,1);y =兰德(10,1);dt = delaunayTriangulation (x, y)
dt = delaunayTriangulation属性:分:[10 x2双]ConnectivityList: [11 x3双]约束:[]
triplot (dt);%%显示顶点和三角形标签的阴谋持有vxlabels = arrayfun (@ (n) {sprintf (“P % d 'n)}, (1:10) ');Hpl =文本(x, y, vxlabels,“FontWeight”,“大胆”,“HorizontalAlignment”,“中心”,“写成BackgroundColor”,“没有”);ic =内心(dt);numtri =大小(dt, 1);trilabels = arrayfun (@ (x) {sprintf (' T % d ',x)}, (1: numtri) ');Htl =文本(ic (: 1), ic (:, 2), trilabels,“FontWeight”,“大胆”,“HorizontalAlignment”,“中心”,“颜色”,“蓝”);持有

示例二:创建和绘制3 d德劳内三角测量

这个例子向您展示了如何计算一个三维德劳内三角以及如何画出三角。

X =兰德(10,3)
X =10×30.6557 0.7060 0.4387 0.0357 0.0318 0.3816 0.8491 0.2769 0.7655 0.9340 0.0462 0.7952 0.6787 0.0971 0.1869 0.7577 0.8235 0.4898 0.7431 0.6948 0.4456 0.3922 0.3171 0.6463 0.6555 0.9502 0.7094 0.1712 0.0344 0.7547
dt = delaunayTriangulation (X)
dt = delaunayTriangulation属性:分:[10 x3双]ConnectivityList: [22 x4双]约束:[]
tetramesh (dt,“FaceColor”,“青色”);

%显示大的四面体网格使用convexHull方法%计算边界三角测量和使用trisurf绘制它。%为例;% triboundary = convexHull (dt)% trisurf (triboundary X (: 1) X (:, 2), X (:, 3),“FaceColor”、“青色”)

示例三:三角测量数据结构的访问

有两种方法来访问三角测量的数据结构。一种方法是通过三角测量属性,另一种方法是使用索引。

创建一个二维德劳内随机三角从10分。

X =兰德(10,2)
X =10×20.2760 0.7513 0.6797 0.2551 0.6551 0.5060 0.1626 0.6991 0.1190 0.8909 0.4984 0.9593 0.9597 0.5472 0.3404 0.1386 0.5853 0.1493 0.2238 0.2575
dt = delaunayTriangulation (X)
dt = delaunayTriangulation属性:分:[10 x2双]ConnectivityList: [12 x3双]约束:[]
%三角测量的数据结构;dt.ConnectivityList
ans =12×34 10 1 3 8 9 10 4 5 4 1 5 1 6 5 3 10 8 1 3 6 2 1 9 7 6 3 7 10 3⋮
%索引是一种速记查询三角测量的方法。的格式是% dt (i, j) j是一个i个三角形的顶点,标准%索引规则适用。%三角测量的数据结构dt (::)
ans =12×34 10 1 3 8 9 10 4 5 4 1 5 1 6 5 3 10 8 1 3 6 2 1 9 7 6 3 7 10 3⋮

第二个三角形;

:dt (2)
ans =1×33 8 9

第二个三角形的第三个顶点;

dt (2、3)
ans = 9

前三个三角形;

:dt (1:3)
ans =3×34 10 1 3 8 9 10 4 5

示例4:编辑一个德劳内三角插入或删除点

这个例子展示了如何使用基于索引下标插入或删除点。更高效的编辑delaunayTriangulation进行少量修改,而不是从头重新创建一个新的delaunayTriangulation,如果数据集很大尤其如此。

%建立德劳内三角% 10随机分在一个单位正方形x =兰德(10,1);y =兰德(10,1);dt = delaunayTriangulation (x, y)
dt = delaunayTriangulation属性:分:[10 x2双]ConnectivityList: [12 x3双]约束:[]
% 5插入额外的随机点dt.Points(+(1:5):) =兰德(5,2)
dt = delaunayTriangulation属性:分:[15 x2双]ConnectivityList: [21 x3双]约束:[]

取代第五个点

dt.Points (5) = (0,0)
dt = delaunayTriangulation属性:分:[15 x2双]ConnectivityList: [21 x3双]约束:[]

删除第四点

dt.Points (4) = []
dt = delaunayTriangulation属性:分:[14 x2双]ConnectivityList: [19 x3双]约束:[]

示例5:创建一个受限的德劳内三角测量

这个例子向您展示了如何创建一个简单的约束德劳内三角并说明约束的影响。

X = [0 0;16 0;16 2;2 2;2 3;8 3;8 5;0 5);C = [1 2;2 3; 3 4; 4 5; 5 6; 6 7; 7 8; 8 1]; dt = delaunayTriangulation(X, C); subplot(2,1,1); triplot(dt); axis([-1 17 -1 6]); xlabel(“限制德劳内三角”,“fontweight”,“b”);%画出约束边缘为红色持有;情节(X (C), X (C +大小(X, 1)),“- r”,“线宽”2);持有;%现在情节删除约束和无约束德劳内dt。约束= [];次要情节(2,1,2);triplot (dt);轴(17 [1 1 6]);包含(“无约束德劳内三角”,“fontweight”,“b”);

示例6:创建一个受限的德劳内三角的地理地图

加载地图的周长美国相接的。构造一个受限的德劳内表示多边形的三角剖分。这个三角域界的点集的凸包。过滤掉的三角形域内的多边形和情节。注意:数据集包含重复的数据点;这是两个或两个以上的点有相同的位置。重复的点是拒绝和delaunayTriangulation将相应的约束。

clf负载usapolygon%定义一个边缘约束连续两个之间%点构成的多边形边界。nump =元素个数(uslon);C = [(1: (nump-1)) (2: nump)”;nump 1];dt = delaunayTriangulation (uslon uslat C);
警告:已发现和删除重复数据点。三角测量指标定义和约束对delaunayTriangulation独特的点集。
警告:交叉边缘约束已经分裂,这可能增加了新的点到三角。
io = dt.isInterior ();补丁(“脸”dt (io,:)“顶点”dt.Points,“FaceColor”,“r”);轴平等的;轴([-130 -60 20 55]);包含(“usapolygon约束德劳内三角”,“fontweight”,“b”);

例7:曲线从点云重建

这个例子强调了使用德劳内三角重建一个多边形边界的云点。重建算法是基于优雅的地壳。

参考:n . Amenta m·伯尔尼,d . o艾普斯坦。地壳和beta-skeleton:组合曲线重建。图形模型和图像处理,60:125 - 135,1998。

%创建一个代表点云的点的集合numpts = 192;t = linspace(π-π,numpts + 1) ';t(结束)= [];r = 0.1 + 5 * sqrt (cos (6 * t)。^ 2 + (0.7)。^ 2);x = r。* cos (t);y = r。* sin (t);国际扶轮= randperm (numpts);x = x (ri);y = y (ri);
%建立德劳内点集的三角剖分。dt = delaunayTriangulation (x, y);三= dt (:,);
%将泰森多边形法顶点的位置插入到现有的%三角V = dt.voronoiDiagram ();%将无限的顶点V (: 1) = [];numv =大小(V, 1);dt.Points (+ (1: numv):) = V;
警告:已发现和删除重复数据点。三角测量指标定义对delaunayTriangulation独特的点集。
%的德劳内边缘连接双采样点表示%的边界。delEdges = dt.edges ();validx = delEdges (: 1) < = numpts;有效地= delEdges (:, 2) < = numpts;boundaryEdges = delEdges ((validx &有效地):)';xb = x (boundaryEdges);yb = y (boundaryEdges);clf;triplot(三,x, y);轴平等的;持有;情节(x, y,“* r”);情节(xb, yb,“- r”);包含(“从点云重建曲线”,“fontweight”,“b”);持有;

例8:计算多边形域的一个近似的中轴

这个例子展示了如何创建一个近似多边形中轴的使用受限的德劳内三角测量领域。内侧一个多边形定义为轴心轨迹的最大磁盘内多边形的中心内部。

%构造一个受限的德劳内三角的样本点%在域边界。负载trimesh2ddt = delaunayTriangulation (x, y,约束);在= dt.isInterior ();
%建立一个三角代表域三角形。tr =三角(dt(内部,:),dt.Points);%构造一组边,加入邻近的外心%的三角形;额外的逻辑结构等一系列独特的边缘。numt =大小(tr, 1);T = (1: numt)”;马嘶声= tr.neighbors ();cc = tr.circumcenter ();xcc = cc (: 1);ycc = cc (:, 2);idx1 = T <马嘶声(:1);idx2 = T <马嘶声(:,2);idx3 = T <马嘶声(:,3);马嘶声= [T (idx1)马嘶声(idx1, 1); T(idx2) neigh(idx2,2); T(idx3) neigh(idx3,3)]';
%情节域三角形在绿色,蓝色和域边界%中轴为红色。clf;triplot (tr,‘g’);持有;情节(xcc马嘶声,ycc(马嘶声),“- r”,“线宽”,1.5);轴([-10 310 -10 310]);轴平等的;情节(x(约束),y(约束),“- b”,“线宽”,1.5);包含(“一个多边形域内轴”,“fontweight”,“b”);持有;

例9:变形2 d网格修改边界

这个例子展示了如何演变的2 d网格域来适应修改域边界。

步骤1:加载数据。定义的网格演变是trife, xfe, yfe,三角face-vertex格式。

负载trimesh2dclf;以triplot (trife xfe yfe);轴平等的;轴([-10 310 -10 310]);轴平等的;包含(“初始网格”,“fontweight”,“b”);

步骤2:构造一个背景三角——限制德劳内点集的三角网格边界。对于每个顶点的网格,计算描述符定义它的位置对背景三角。描述符是封闭的三角形与三角形的重心坐标对。

dt = delaunayTriangulation (x, y,约束);clf;triplot (dt);轴平等的;轴([-10 310 -10 310]);轴平等的;包含(“背景三角”,“fontweight”,“b”);

描述符。以三= pointLocation (dt, xfe yfe);描述符。baryCoords = cartesianToBarycentric (dt,描述符。三,以[xfe yfe]);

步骤3:编辑背景三角域边界将所需的修改。

cc1 = (210 - 90);circ1 = (143:180) ';x (circ1) = (x (circ1) -cc1 (1)) * 0.6 + cc1 (1);y (circ1) = (y (circ1) -cc1 (2)) * 0.6 + cc1 (2);tr =三角(dt (:,:), x, y);clf;triplot (tr);轴([-10 310 -10 310]);轴平等的;包含(“编辑背景三角孔大小减少”,“fontweight”,“b”);

步骤4:把描述符回笛卡尔坐标使用变形背景三角作为评价的基础。

Xnew = barycentricToCartesian (tr,描述符。三、descriptors.baryCoords);tr =三角(trife Xnew);clf;triplot (tr);轴([-10 310 -10 310]);轴平等的;包含(“演变网”,“fontweight”,“b”);

这个主题有帮助吗?