计算 Voronoi 图
本示例显示如何计算二维和三维 Voronoi 图。
MATLAB® 提供用于绘制二维 Voronoi 图以及计算 N 维 Voronoi 图的拓扑的函数。事实上,由于所需内存的指数级增长,对高于六维的大中型数据集,Voronoi 计算是不实际的。
voronoi 绘图函数为二维空间的点集绘制 Voronoi 图。在 MATLAB 中,有两种方式计算点集的 Voronoi 图:
voronoin 函数支持为 N 维空间 (N ≥ 2) 中的离散点计算 Voronoi 拓扑。voronoiDiagram 方法支持为二维或三维离散点计算 Voronoi 拓扑。
建议用 voronoiDiagram 方法计算二维或三维拓扑,因为此方法更稳定,对大型数据集表现更佳。此方法支持递增插值、移除点和补充查询,例如最近邻点搜索。
voronoin 函数和 voronoiDiagram 方法使用矩阵格式表示 Voronoi 图的拓扑。有关此数据结构的详细信息,请参阅 三角剖分矩阵格式。
给定点集 X,按如下方式获取 Voronoi 图的拓扑:
使用 voronoin 函数
[V,R] = voronoin(X)
使用 voronoiDiagram 方法
dt = delaunayTriangulation(X);
[V,R] = voronoiDiagram(dt)
V 是表示 Voronoi 顶点(这些顶点是 Voronoi 边的端点)坐标的矩阵。按照惯例,V 中的第一个顶点是无限顶点。R 是向量元胞数组长度 size(X,1),表示与每个点相关联的 Voronoi 区域。因此,与点 X(i) 相关联的 Voronoi 区域是 R{i}。
定义点集并绘制其 Voronoi 图
X = [-1.5 3.2; 1.8 3.3; -3.7 1.5; -1.5 1.3; 0.8 1.2; ...
3.3 1.5; -4.0 -1.0; -2.3 -0.7; 0 -0.5; 2.0 -1.5; ...
3.7 -0.8; -3.5 -2.9; -0.9 -3.9; 2.0 -3.5; 3.5 -2.25];
[VX,VY] = voronoi(X(:,1),X(:,2));
h = plot(VX,VY,'-b',X(:,1),X(:,2),'.r');
xlim([-4,4])
ylim([-4,4])
% Assign labels to the points X.
nump = size(X,1);
plabels = arrayfun(@(n) {sprintf('X%d', n)}, (1:nump)');
hold on
Hpl = text(X(:,1), X(:,2)+0.2, plabels, 'color', 'r', ...
'FontWeight', 'bold', 'HorizontalAlignment',...
'center', 'BackgroundColor', 'none');
% Compute the Voronoi diagram.
dt = delaunayTriangulation(X);
[V,R] = voronoiDiagram(dt);
% Assign labels to the Voronoi vertices V.
% By convention the first vertex is at infinity.
numv = size(V,1);
vlabels = arrayfun(@(n) {sprintf('V%d', n)}, (2:numv)');
hold on
Hpl = text(V(2:end,1), V(2:end,2)+.2, vlabels, ...
'FontWeight', 'bold', 'HorizontalAlignment',...
'center', 'BackgroundColor', 'none');
hold off
R{9} 给出了与点位 X9 相关联的 Voronoi 顶点的索引。
R{9}
ans = 1×5
5 7 17 12 9
Voronoi 顶点的索引是基于 V 数组的索引。
类似地,R{4} 给出了与点位 X4 相关联的 Voronoi 顶点的索引。
R{4}
ans = 1×5
5 9 11 8 6
在三维空间中,Voronoi 区域为凸多面体,创建 Voronoi 图的语法是相似的。但 Voronoi 图的几何形状更加复杂。以下示例描述了三维 Voronoi 图的创建过程和单个区域的绘制过程。
在三维空间创建一个包含 25 个点的样本,并计算此点集的 Voronoi 图的拓扑。
rng('default')
X = -3 + 6.*rand([25 3]);
dt = delaunayTriangulation(X);
计算 Voronoi 图的拓扑。
[V,R] = voronoiDiagram(dt);
求距离原点最近的点,并绘制与此点相关联的 Voronoi 区域。
tid = nearestNeighbor(dt,0,0,0);
XR10 = V(R{tid},:);
K = convhull(XR10);
defaultFaceColor = [0.6875 0.8750 0.8984];
trisurf(K, XR10(:,1) ,XR10(:,2) ,XR10(:,3) , ...
'FaceColor', defaultFaceColor, 'FaceAlpha',0.8)
title('3-D Voronoi Region')