包含重复位置的点集的三角剖分
MATLAB® 中的德劳内算法可以基于特征点集构建三角剖分。如果传递到三角剖分函数或类的点不是特征点,会检测到重复位置并忽略重复点。这样生成的三角剖分不会参照原始输入中的一些点,即重复点。使用 delaunay 和 delaunayn 函数时,重复情况的存在可能没什么影响。但是,由于 delaunayTriangulation 类提供的许多查询以索引为基础,因此必须了解 delaunayTriangulation 对特征数据集执行三角剖分和处理。因此,基于唯一点集创建索引是惯例。这些数据通过 delaunayTriangulation 的 Points 属性维护。
以下示例说明了在处理 delaunayTriangulation 时参照在 Points 属性内存储的特征数据集的重要性:
rng("default")
P = rand([25 2]);
P(18,:) = P(8,:)
P(16,:) = P(6,:)
P(12,:) = P(2,:)
DT = delaunayTriangulation(P)
Points 属性显示已从数据中删除重复点。DT =
delaunayTriangulation with properties:
Points: [22x2 double]
ConnectivityList: [31x3 double]
Constraints: []DT.Points 的索引。因此,使用以下代码计算并绘制凸包:K = DT.convexHull(); plot(DT.Points(:,1),DT.Points(:,2),"."); hold on plot(DT.Points(K,1),DT.Points(K,2),"r");
delaunayTriangulation 提供的索引一起使用,则结果不正确。delaunayTriangulation 处理基于特征数据集 DT.Points 的索引。例如,以下内容会生成错误的绘图,因为 K 的索引是关于 DT.Points 的,而不是关于 P 的。K = DT.convexHull(); plot(P(:,1),P(:,2),"."); hold on plot(P(K,1),P(K,2),"r");
delaunayTriangulation 之前删除重复项来创建特征数据集,通常更为方便。这样做将消除可能会出现混淆的情况。如下所示,可以使用 unique 函数完成上述操作: rng("default") P = rand([25 2]); P(18,:) = P(8,:) P(16,:) = P(6,:) P(12,:) = P(2,:) [~,I,~] = unique(P,"first","rows"); I = sort(I); P = P(I,:); DT = delaunayTriangulation(P) % The point set is unique