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

Voronoi 图的理解的更多相关文章

  1. Voronoi图和Delaunay三角剖分

    刷题的时候发现了这么一个新的东西:Voronoi图和Delaunay三角剖分 发现这个东西可以$O(nlogn)$解决平面图最小生成树问题感觉非常棒 然后就去学了.. 看的n+e的blog,感谢n+e ...

  2. 《图像处理实例》 之 Voronoi 图

    Voronoi 图的设计 以下的改进是http://www.imagepy.org/的作者原创,我只是对其理解之后改进和说明,欢迎大家使用这个小软件! 如有朋友需要源工程,请在评论处留邮箱! 说明:类 ...

  3. 渲染voronoi图

    渲染voronoi图要比计算voronoi图简单. 渲染voronoi图: 方法1: 在pixel shader里,对每一个像素,求哪个种子点到它的距离最近,将此种子点的颜色作为此像素颜色. 当种子点 ...

  4. Arcgis做出voronoi图

    人类第一步,,,我需要给我目前的基站点数据划分voronoi,预期得到每个基站的服务范围 在地统计模块geostatistical analysis 下面的数据探索expore就有Voronoi图 将 ...

  5. UML序列图的理解:

    UML序列图的理解:UML序列图是指一个对象的方法在处理过程中调用其他对象的图:重点是要突出调用其他对象的序列:

  6. Voronoi图及matlab实现

    [题外话:想一想真是...美赛时我预测求爱尔兰的充电站位置分布,画Voronoi图,程序跑了一个小时...]   Voronoi图,又叫泰森多边形或Dirichlet图,它是由一组由连接两邻点直线的垂 ...

  7. OpenCV生成点集的Delaunay剖分和Voronoi图

    实现内容: 设置一副图像大小为600*600.图像像素值全为0,为黑色. 在图像中Rect(100,100,400,400)的区域随机产生20个点.并画出. 产生这些点集的Delaunay剖分和Vor ...

  8. 大话Spark(3)-一图深入理解WordCount程序在Spark中的执行过程

    本文以WordCount为例, 画图说明spark程序的执行过程 WordCount就是统计一段数据中每个单词出现的次数, 例如hello spark hello you 这段文本中hello出现2次 ...

  9. 图的理解:深度优先和广度优先遍历及其 Java 实现

    遍历 图的遍历,所谓遍历,即是对结点的访问.一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: 深度优先遍历 广度优先遍历 深度优先 深度优先遍历,从初始访问结点出发,我们知道 ...

  10. 看图轻松理解数据结构与算法系列(NoSQL存储-LSM树) - 全文

    <看图轻松理解数据结构和算法>,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握.本系列包括各种堆.各种队列.各种列表.各种树.各种图.各种排序等等几十篇的样子. 关于LSM树 ...

随机推荐

  1. 你认为Vonajs提供的这些特性会比Nestjs更好用吗?

    Nestjs是一款非常强大的Node.js框架,而且入门非常容易,但是随着项目的增长,各种不便之处就会显现出来,许多代码书写起来不再像项目刚启动时直观.而Vonajs是一款全新的Node.js框架,提 ...

  2. cuda grid block size

    编译命令:nvcc hello.cu -o hello 运行:./hello #include <stdio.h> __global__ void helloWorldKernel() { ...

  3. 自定义localStorage监听事件

    一.问题 在项目开发过程中,发现有很多时候进行localStorage.setItem()操作设置本地存储后,页面必须刷新才能够获取到存储数据,而有些时候本地缓存更新后,页面无法通过再次刷新以获取本地 ...

  4. burpsuite插件-验证码识别插件使用教程

    一.插件下载 下载最新插件与验证码识别端(captcha-killer-modified.jar.codereg.py) 使用Burp加载captcha-killer-modified.jar 安装p ...

  5. CentOS 使用 IUS _ SCL 第三方软件源

    CentOS 使用 IUS / SCL 第三方软件源 使用centos 经常发现官方提供的软件包版本过低,很多时候大家会选择下载源码自行编译,带来了很多麻烦. centos安装最新版本软件包,例如gi ...

  6. 一次说清楚:CAE软件可以做什么?

    引言: 计算机辅助工程(CAE)软件是现代工程设计与分析的重要工具,它以计算机技术为基础,利用数值模拟和仿真方法来解决各种工程问题.本文将探讨CAE软件的广泛应用领域,以及它在工程设计与分析中的作用. ...

  7. Spring Cloud微服务架构深度解析

    在分布式系统单体应用拆分为多个独立服务,实现了高内聚.低耦合的架构目标.本文从核心组件.服务治理.配置管理及面试高频问题四个维度,结合Spring Cloud生态与工程实践,系统解析微服务架构的实现原 ...

  8. 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肯定为空,那么扩 ...

  9. Go协程简单学习

    什么是协程? 协程类似于线程,但是比线程更加轻量.一个程序启动会占用一个进程 而一个进程可以拥有多个线程 ,一个线程可以拥有多个协程. 一个进程至少包含一个主线程,一个主线程可以有更多的子线程. 线程 ...

  10. SQL Server CMD 执行sqlServer脚本

    https://blog.csdn.net/qq395537505/article/details/88947111 https://blog.csdn.net/gnail_oug/article/d ...