主要内容

包含重复位置的点集的三角剖分

MATLAB® 中的德劳内算法可以基于特征点集构建三角剖分。如果传递到三角剖分函数或类的点不是特征点,会检测到重复位置并忽略重复点。这样生成的三角剖分不会参照原始输入中的一些点,即重复点。使用 delaunaydelaunayn 函数时,重复情况的存在可能没什么影响。但是,由于 delaunayTriangulation 类提供的许多查询以索引为基础,因此必须了解 delaunayTriangulation 对特征数据集执行三角剖分和处理。因此,基于唯一点集创建索引是惯例。这些数据通过 delaunayTriangulationPoints 属性维护。

以下示例说明了在处理 delaunayTriangulation 时参照在 Points 属性内存储的特征数据集的重要性:

rng("default")
P = rand([25 2]);
P(18,:) = P(8,:)
P(16,:) = P(6,:)
P(12,:) = P(2,:)
DT = delaunayTriangulation(P)
创建三角剖分时,MATLAB 会发出一条警告。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