DelaunayTri
您可以通过使用类及其edges
和nearestNeighbor
方法来实现您的第一个想法,即选择中点落在与 Voronoi 线的交点上的边。这是一个包含 10 对随机x
和y
值的示例:
x = rand(10,1); %# Random x data
y = rand(10,1); %# Random y data
dt = DelaunayTri(x,y); %# Compute the Delaunay triangulation
edgeIndex = edges(dt); %# Triangulation edge indices
midpts = [mean(x(edgeIndex),2) ... %# Triangulation edge midpoints
mean(y(edgeIndex),2)];
nearIndex = nearestNeighbor(dt,midpts); %# Find the vertex nearest the midpoints
keepIndex = (nearIndex == edgeIndex(:,1)) | ... %# Find the edges where the
(nearIndex == edgeIndex(:,2)); %# midpoint is not closer to
%# another vertex than it is
%# to one of its end vertices
edgeIndex = edgeIndex(keepIndex,:); %# The "good" edges
现在edgeIndex
是一个 N×2 矩阵,其中每一行包含一个定义“近”连接的边缘的x
索引y
。下图说明了 Delaunay 三角剖分(红线)、Voronoi 图(蓝线)、三角剖分边的中点(黑色星号)以及保留在其中的“好”边edgeIndex
(粗红线):
triplot(dt,'r'); %# Plot the Delaunay triangulation
hold on; %# Add to the plot
plot(x(edgeIndex).',y(edgeIndex).','r-','LineWidth',3); %# Plot the "good" edges
voronoi(dt,'b'); %# Plot the Voronoi diagram
plot(midpts(:,1),midpts(:,2),'k*'); %# Plot the triangulation edge midpoints
这个怎么运作...
Voronoi 图由一系列 Voronoi 多边形或单元组成。在上图中,每个单元表示给定三角剖分顶点周围的区域,该区域包含空间中比任何其他顶点更接近该顶点的所有点。因此,当您有 2 个顶点不靠近任何其他顶点(如图像中的顶点 6 和 8)时,连接这些顶点的线的中点落在 Voronoi 单元之间的分隔线上顶点。
但是,当有第三个顶点靠近连接 2 个给定顶点的线时,则第三个顶点的 Voronoi 单元可能在 2 个给定顶点之间延伸,穿过连接它们的线并包围该线的中点。因此,这第三个顶点可以被认为是 2 个给定顶点的“更近”邻居,而不是 2 个顶点彼此之间的距离。在您的图像中,顶点 7 的 Voronoi 单元延伸到顶点 1 和 2(以及 1 和 3)之间的区域,因此顶点 7 被认为比顶点 2(或 3)更接近顶点 1。
在某些情况下,即使两个顶点的 Voronoi 单元相接触,该算法也可能不会将两个顶点视为“近”邻居。图像中的顶点 3 和 5 就是一个例子,其中顶点 2 被认为是顶点 3 或 5 比顶点 3 或 5 彼此更接近的邻居。