matlab+voronoin函数,Voronoi 图

计算 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

c3c5977d6f43643925d96a100832dfa3.png

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')

800e84423f5309398e73dcd7a0d24adf.png

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值