您可以通过使用
DelaunayTri class及其
edges和
nearestNeighbor方法来实现您的第一个想法,即选择其中点落在与Voronoi线交点的边。这里有一个x和y值的10个随机对的例子:
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多边形或细胞组成。在上述图像中,每个单元格表示给定的三角测量顶点周围的区域,其包围空间中比任何其它顶点更靠近该顶点的所有点。因此,当您有两个顶点不靠近任何其他顶点(如图像中的顶点6和8)时,连接这些顶点的线的中点落在Voronoi单元之间的分隔线上顶点。
然而,当存在接近连接2个给定顶点的线的第三顶点时,第三顶点的Voronoi单元可以在2个给定顶点之间延伸,穿过连接它们的线并且包围该线中点。因此,这个第三个顶点可以被认为是比两个顶点彼此相对的2个给定顶点的“更接近”的邻居。在您的图像中,顶点7的Voronoi单元延伸到顶点1和2(和1和3)之间的区域,因此顶点7被认为比顶点2(或3)更靠近顶点1。
在某些情况下,该算法可能不会将两个顶点视为“近”邻居,即使它们的Voronoi细胞接触。您的图像中的顶点3和5就是一个例子,其中顶点2被认为比顶点3或5彼此相对于顶点3或5的最近邻居。