您可以使用DelaunayTri
类及其边
和nearestNeighbor
方法。下面是一个包含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-by-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
How it works...
Voronoi图由一系列Voronoi多边形或单元组成。在上面的图像中,每个单元表示给定三角测量顶点周围的区域,该区域包含空间中比任何其他顶点更靠近该顶点的所有点。因此,当有两个顶点不靠近任何其他顶点(如图像中的顶点6和8)时,连接这些顶点的线的中点位于顶点的Voronoi单元之间的分隔线上。
然而,当存在靠近连接2个给定顶点的线的第三顶点时,则用于第三顶点的Voronoi单元可以在2个给定的顶点之间延伸,穿过连接它们的线并包围该线的中点。因此,这第三个顶点可以被认为是两个给定顶点的“更近”的邻居,而不是两个顶点彼此的邻居。在您的图像中,顶点7的Voronoi单元延伸到顶点1和2(以及1和3)之间的区域,因此顶点7被认为是比顶点2(或3)更靠近顶点1的邻居。
在某些情况下,该算法可能不会将两个顶点视为“近”邻居,即使它们的Voronoi单元接触。图像中的顶点3和5就是一个例子,其中顶点2被认为是与顶点3或5的邻居,而不是与顶点3或者5的邻居。