Voronoi 图的理解
1、基本概念
维诺图(Voronoi Diagram)又叫泰森多边形或 Dirichlet 图,由两邻点连线的垂直平分线组成的连续多边形构成。
特点:
每个V多边形内有一个生成元;
每个V多边形内点到该生成元距离短于到其它生成元距离;
多边形边界上的点到生成此边界的生成元距离相等;
邻接图形的 Voronoi 多边形界线以原邻接界线作为子集。
- 生成点:每个Voronoi区域由一个生成点决定,区域内的点距离该生成点最近。
- Voronoi 边界:Voronoi区域之间的边界是两生成点距离相等的点集。
- Voronoi 顶点:多个Voronoi边界交汇的点,被称为Voronoi顶点,是距离三个或更多生成点相等的点。
2、Voronoi 图的生成算法
Voronoi 图有着按距离划分邻近区域的普遍特性,应用范围广。生成 V 图的方法很多,常见的有分治法、扫描线算法和Delaunay三角剖分算法。
下面采用的是 Delaunay 三角剖分算法。主要是指生成 Voronoi 图时先生成其对偶元 Delaunay 三角网,再找出三角网每一三角形的外接圆圆心,最后连接相邻三角形的外接圆圆心,形成以每一三角形顶点为生成元的多边形网。
建立 Voronoi 图的步骤为:
- 离散点自动构建三角网,即构建Delaunay三角网。对离散点和形成的三角形编号,记录每个三角形是由哪三个离散点构成的。
- 计算每个三角形的外接圆圆心,并记录之。
- 遍历三角形链表,寻找与当前三角形pTri三边共边的相邻三角形TriA,TriB和TriC。
- 如果找到,则把寻找到的三角形的外心与pTri的外心连接,存入维诺边链表中。如果找不到,则求出最外边的中垂线射线存入维诺边链表中。
- 遍历结束,所有维诺边被找到,根据边画出维诺图。
3、Voronoi 图的应用
Voronoi图在机器人路径规划上有着广泛的应用,尤其是在需要避开障碍物或者在多个目标间平衡距离时。以下是一些主要用途:
- 避开障碍物:在环境中,Voronoi图的边可以视作离障碍物最远的安全路径。因此,机器人可以依据Voronoi图来规划路径,避开障碍物,减少与障碍物的接触可能性。
- 多目标路径规划:当机器人要在多个目标点间移动时,可以利用Voronoi图先将每个目标点连接成网络,然后规划从一个目标点到另一个目标点的最优路径。这种方法能够找到最短的、同时尽可能避开障碍物的路径。
- 覆盖路径规划:在需要机器人对环境进行覆盖式探索或者清扫的场景中(例如草地割草、地雷检测等),可以利用Voronoi图来规划机器人的路径,使得机器人能均匀地覆盖整个区域,提高效率。
- 多机器人协同:在实际应用中,由于Voronoi图可能会产生一些过窄的通道,通常会结合其他路径规划方法(比如A*、Dijkstra、RRT等)一起使用,以生成对于机器人行走更友好的路径。
4、使用Python生成Voronoi 图
Python中的 scipy.spatial
库提供了 Voronoi
类,可以方便地生成和绘制 Voronoi 图。下面是使用 scipy.spatial.Voronoi
和 matplotlib
库绘制二维 Voronoi 图的示例代码。
1 import numpy as np
2 import matplotlib.pyplot as plt
3 from scipy.spatial import Voronoi, voronoi_plot_2d
4
5 # 定义生成点
6 points = np.array([[0.2, 0.4], [0.6, 0.5], [0.5, 0.2], [0.8, 0.8], [0.3, 0.7]])
7
8 # 生成Voronoi图
9 vor = Voronoi(points)
10
11 # 绘制Voronoi图
12 fig, ax = plt.subplots(figsize=(6, 6))
13 voronoi_plot_2d(vor, ax=ax, show_vertices=False, line_colors='orange', line_width=2)
14
15 # 绘制生成点
16 ax.plot(points[:, 0], points[:, 1], 'bo', markersize=8, label="生成点")
17
18 plt.legend()
19 plt.title("Voronoi 图示例")
20 plt.show()
1 import numpy as np
2 import matplotlib.pyplot as plt
3 from scipy.spatial import Voronoi,voronoi_plot_2d
4
5 np.random.seed()
6 points=np.random.rand(40,2)
7
8 vor=Voronoi(points)
9
10 voronoi_plot_2d(vor,show_points=True,show_vertices=False,line_width=0.5)
11
12 plt.show()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了