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

Voronoi 图的理解的更多相关文章
- Voronoi图和Delaunay三角剖分
刷题的时候发现了这么一个新的东西:Voronoi图和Delaunay三角剖分 发现这个东西可以$O(nlogn)$解决平面图最小生成树问题感觉非常棒 然后就去学了.. 看的n+e的blog,感谢n+e ...
- 《图像处理实例》 之 Voronoi 图
Voronoi 图的设计 以下的改进是http://www.imagepy.org/的作者原创,我只是对其理解之后改进和说明,欢迎大家使用这个小软件! 如有朋友需要源工程,请在评论处留邮箱! 说明:类 ...
- 渲染voronoi图
渲染voronoi图要比计算voronoi图简单. 渲染voronoi图: 方法1: 在pixel shader里,对每一个像素,求哪个种子点到它的距离最近,将此种子点的颜色作为此像素颜色. 当种子点 ...
- Arcgis做出voronoi图
人类第一步,,,我需要给我目前的基站点数据划分voronoi,预期得到每个基站的服务范围 在地统计模块geostatistical analysis 下面的数据探索expore就有Voronoi图 将 ...
- UML序列图的理解:
UML序列图的理解:UML序列图是指一个对象的方法在处理过程中调用其他对象的图:重点是要突出调用其他对象的序列:
- Voronoi图及matlab实现
[题外话:想一想真是...美赛时我预测求爱尔兰的充电站位置分布,画Voronoi图,程序跑了一个小时...] Voronoi图,又叫泰森多边形或Dirichlet图,它是由一组由连接两邻点直线的垂 ...
- OpenCV生成点集的Delaunay剖分和Voronoi图
实现内容: 设置一副图像大小为600*600.图像像素值全为0,为黑色. 在图像中Rect(100,100,400,400)的区域随机产生20个点.并画出. 产生这些点集的Delaunay剖分和Vor ...
- 大话Spark(3)-一图深入理解WordCount程序在Spark中的执行过程
本文以WordCount为例, 画图说明spark程序的执行过程 WordCount就是统计一段数据中每个单词出现的次数, 例如hello spark hello you 这段文本中hello出现2次 ...
- 图的理解:深度优先和广度优先遍历及其 Java 实现
遍历 图的遍历,所谓遍历,即是对结点的访问.一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: 深度优先遍历 广度优先遍历 深度优先 深度优先遍历,从初始访问结点出发,我们知道 ...
- 看图轻松理解数据结构与算法系列(NoSQL存储-LSM树) - 全文
<看图轻松理解数据结构和算法>,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握.本系列包括各种堆.各种队列.各种列表.各种树.各种图.各种排序等等几十篇的样子. 关于LSM树 ...
随机推荐
- 你认为Vonajs提供的这些特性会比Nestjs更好用吗?
Nestjs是一款非常强大的Node.js框架,而且入门非常容易,但是随着项目的增长,各种不便之处就会显现出来,许多代码书写起来不再像项目刚启动时直观.而Vonajs是一款全新的Node.js框架,提 ...
- cuda grid block size
编译命令:nvcc hello.cu -o hello 运行:./hello #include <stdio.h> __global__ void helloWorldKernel() { ...
- 自定义localStorage监听事件
一.问题 在项目开发过程中,发现有很多时候进行localStorage.setItem()操作设置本地存储后,页面必须刷新才能够获取到存储数据,而有些时候本地缓存更新后,页面无法通过再次刷新以获取本地 ...
- burpsuite插件-验证码识别插件使用教程
一.插件下载 下载最新插件与验证码识别端(captcha-killer-modified.jar.codereg.py) 使用Burp加载captcha-killer-modified.jar 安装p ...
- CentOS 使用 IUS _ SCL 第三方软件源
CentOS 使用 IUS / SCL 第三方软件源 使用centos 经常发现官方提供的软件包版本过低,很多时候大家会选择下载源码自行编译,带来了很多麻烦. centos安装最新版本软件包,例如gi ...
- 一次说清楚:CAE软件可以做什么?
引言: 计算机辅助工程(CAE)软件是现代工程设计与分析的重要工具,它以计算机技术为基础,利用数值模拟和仿真方法来解决各种工程问题.本文将探讨CAE软件的广泛应用领域,以及它在工程设计与分析中的作用. ...
- Spring Cloud微服务架构深度解析
在分布式系统单体应用拆分为多个独立服务,实现了高内聚.低耦合的架构目标.本文从核心组件.服务治理.配置管理及面试高频问题四个维度,结合Spring Cloud生态与工程实践,系统解析微服务架构的实现原 ...
- 7.Java SDK源码分析系列笔记-JDK1.8 HashMap
目录 1. 是什么 2. 如何使用 3. 原理分析 3.1. uml 3.2. 构造方法 3.3. put方法 3.3.1. 计算key的hash值 3.3.2. 第一次进来table肯定为空,那么扩 ...
- Go协程简单学习
什么是协程? 协程类似于线程,但是比线程更加轻量.一个程序启动会占用一个进程 而一个进程可以拥有多个线程 ,一个线程可以拥有多个协程. 一个进程至少包含一个主线程,一个主线程可以有更多的子线程. 线程 ...
- SQL Server CMD 执行sqlServer脚本
https://blog.csdn.net/qq395537505/article/details/88947111 https://blog.csdn.net/gnail_oug/article/d ...