Voronoi 图的理解

 


1、基本概念

维诺图(Voronoi Diagram)又叫泰森多边形或 Dirichlet 图,由两邻点连线的垂直平分线组成的连续多边形构成。

特点:

每个V多边形内有一个生成元;

每个V多边形内点到该生成元距离短于到其它生成元距离;

多边形边界上的点到生成此边界的生成元距离相等;

邻接图形的 Voronoi 多边形界线以原邻接界线作为子集。

  • 生成点:每个Voronoi区域由一个生成点决定,区域内的点距离该生成点最近。
  • Voronoi 边界:Voronoi区域之间的边界是两生成点距离相等的点集。
  • Voronoi 顶点:多个Voronoi边界交汇的点,被称为Voronoi顶点,是距离三个或更多生成点相等的点。

 

2、Voronoi 图的生成算法

Voronoi 图有着按距离划分邻近区域的普遍特性,应用范围广。生成 V 图的方法很多,常见的有分治法、扫描线算法和Delaunay三角剖分算法。

下面采用的是 Delaunay 三角剖分算法。主要是指生成 Voronoi 图时先生成其对偶元 Delaunay 三角网,再找出三角网每一三角形的外接圆圆心,最后连接相邻三角形的外接圆圆心,形成以每一三角形顶点为生成元的多边形网。

               

 建立 Voronoi 图的步骤为:

  1. 离散点自动构建三角网,即构建Delaunay三角网。对离散点和形成的三角形编号,记录每个三角形是由哪三个离散点构成的。
  2. 计算每个三角形的外接圆圆心,并记录之。
  3. 遍历三角形链表,寻找与当前三角形pTri三边共边的相邻三角形TriA,TriB和TriC。
  4. 如果找到,则把寻找到的三角形的外心与pTri的外心连接,存入维诺边链表中。如果找不到,则求出最外边的中垂线射线存入维诺边链表中。
  5. 遍历结束,所有维诺边被找到,根据边画出维诺图。

3、Voronoi 图的应用

Voronoi图在机器人路径规划上有着广泛的应用,尤其是在需要避开障碍物或者在多个目标间平衡距离时。以下是一些主要用途:

  • 避开障碍物:在环境中,Voronoi图的边可以视作离障碍物最远的安全路径。因此,机器人可以依据Voronoi图来规划路径,避开障碍物,减少与障碍物的接触可能性。
  • 多目标路径规划:当机器人要在多个目标点间移动时,可以利用Voronoi图先将每个目标点连接成网络,然后规划从一个目标点到另一个目标点的最优路径。这种方法能够找到最短的、同时尽可能避开障碍物的路径。
  • 覆盖路径规划:在需要机器人对环境进行覆盖式探索或者清扫的场景中(例如草地割草、地雷检测等),可以利用Voronoi图来规划机器人的路径,使得机器人能均匀地覆盖整个区域,提高效率。
  • 多机器人协同:在实际应用中,由于Voronoi图可能会产生一些过窄的通道,通常会结合其他路径规划方法(比如A*、Dijkstra、RRT等)一起使用,以生成对于机器人行走更友好的路径。

4、使用Python生成Voronoi 图

Python中的 scipy.spatial 库提供了 Voronoi 类,可以方便地生成和绘制 Voronoi 图。下面是使用 scipy.spatial.Voronoimatplotlib 库绘制二维 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()
复制代码

              

 

 

posted @   taohuaxiaochunfeng  阅读(1168)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示

目录导航