建议先看一下voronoi的基本概念:

【数学之美】泰森多边形的构造和应用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Ea4y1H7LT

Voronoi详细代码以及请参考:

Spatial data structures and algorithms (scipy.spatial) — SciPy v1.7.1 Manualhttps://docs.scipy.org/doc/scipy/reference/tutorial/spatial.html本文适用于刚学习voronoi小白,并对上面链接中解释不详细的地方进行一定的解释

上源码,可直接使用Python编译器编译:(如果编译不了,显示numpy等用不了请百度自行解决)

from scipy.spatial import *
import numpy as np
import random
import matplotlib.pyplot as pltpoints = np.array([[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2],[2, 0], [2, 1], [2, 2]])
vor = Voronoi(points)vor.vertices
vor.regions
vor.ridge_vertices
vor.ridge_pointsprint(vor.vertices,vor.regions,vor.ridge_vertices,vor.ridge_points)plt.plot(points[:, 0], points[:, 1], 'o')
plt.plot(vor.vertices[:, 0], vor.vertices[:, 1], '*')
plt.xlim(-1, 3); plt.ylim(-1, 3)
# plt.show()for simplex in vor.ridge_vertices:simplex = np.asarray(simplex)if np.all(simplex >= 0):plt.plot(vor.vertices[simplex, 0], vor.vertices[simplex, 1], 'k-')
# plt.show()  #画出四个质心点的框center = points.mean(axis=0)
for pointidx, simplex in zip(vor.ridge_points, vor.ridge_vertices):simplex = np.asarray(simplex)if np.any(simplex < 0):i = simplex[simplex >= 0][0]  # finite end Voronoi vertext = points[pointidx[1]] - points[pointidx[0]]  # tangentt = t / np.linalg.norm(t)n = np.array([-t[1], t[0]])  # normalmidpoint = points[pointidx].mean(axis=0)far_point = vor.vertices[i] + np.sign(np.dot(midpoint - center, n)) * n * 100plt.plot([vor.vertices[i, 0], far_point[0]],[vor.vertices[i, 1], far_point[1]], 'k--')
plt.show()

可得到结果:

为了便于理解,将上述结果图做一定的标记,如下:

(此图转载自于如下连接,如有侵权,联系删除)python 泰森多边形法函数属性理解(python Voronoi function properties explained in detial) - ttweixiao9999 - 博客园 (cnblogs.com)https://www.cnblogs.com/ttweixiao-IT-program/p/14374270.html

图1

points = np.array([[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2],[2, 0], [2, 1], [2, 2]])

points对应图1中的point0,point1,……,point8

>>vor.vertices
#输出结果为:
[[0.5 0.5][0.5 1.5][1.5 0.5][1.5 1.5]]

vor.vertices对应的是图橙色的四个点,即voronoi的四个顶点vertice0,vertice1,vertice2,vertice3,这四个顶点的顺序以及数值很重要,后面要考。

>>vor.regions
[[], [-1, 0], [-1, 1], [1, -1, 0], [3, -1, 2], [-1, 3], [-1, 2], [0, 1, 3, 2], [2, -1, 0], [3, -1, 1]]

vor.regions里面存储的索引要结合上面vor.vertices的值来看(注意:-1表示voronoi 的顶点在无穷远处)。结合图1,vor.regions [-1, 0] 表示该区域中一个voronoi的顶点是vertice 0,另一个顶点在无穷远处,由此可以确定voronoi region1(对应图1中蓝色字体)。

再看,vor.regions [1, -1, 0],表示该区域的两个voronoi的顶点是 vertice 0和vertice 1,还有一个顶点在无穷远处,由此课确定voronoi region3(对应图1中蓝色的字体)。

再看一个比较特殊的,vor.regions [0, 1, 3, 2],表示该区的四个顶点是分别vertice 0, vertice 1, vertice 3, vertice2.由此可确定voronoi region7(对应图1中蓝色的字体)

由上可以推出其他的voronoi region区域

注意vor.regions里面存储的索引[-1, 0], [-1. 1], [1, -1, 0]……[3, -1,1 ]分别对应voronoi region1, voronoi region2, voronoi region3, …… , voronoi region9, 是有顺序的

>>vor.ridge_vertices
[[-1, 0], [-1, 0], [-1, 1], [-1, 1], [0, 1], [-1, 3], [-1, 2], [2, 3], [-1, 3], [-1, 2], [1, 3], [0, 2]]

vor.ridege_vertices里面存储的索引对应图1中的ridge line0, ridege line1, …… ,ridge line 11, 同上文-1表示顶点在无穷远处

vor.ridege_vertices表示构成每个 Voronoi 脊线(ridge line)的 Voronoi 顶点(vertices)索引,要结合vertice顶点来区分,[-1, 0]表示脊线的一个顶点在vertice0,另一个在无穷远处,[-1, 3]表示其中一个顶点在vertice3另一个在无穷远处,由此规律可以找出ridge line0, ridege line1, …… ,ridge line 11所在的位置。

>>vor.ridge_points
[[0 3][0 1][2 5][2 1][1 4][7 8][7 6][7 4][8 5][6 3][4 5][4 3]]

vor.ridge_points表示每条 Voronoi 脊线(ridge line)附近的点(points)的索引,即每条脊线的控制点。

结合图1,可以看到ridge line1的控制点为point0,point3,即对应输出结果的[0, 3],ridege line2对应的控制点为point0和point1,即对应输出结果的[0, 1]

注意:vor.ridge_points里面存储的索引也存在一一对应的关系

for simplex in vor.ridge_vertices:simplex = np.asarray(simplex)if np.all(simplex >= 0):plt.plot(vor.vertices[simplex, 0], vor.vertices[simplex, 1], 'k-')

经过上面对每个参数的详细解释,此段代码使用了for循环连接图1中4个Vertices0,1,2,3顶点。ridge_vertices里面存储的索引是4个顶点之间的连接线,且只有大于0的时候才说明这条连接线是4个顶点之间的连接线。

center = points.mean(axis=0)
for pointidx, simplex in zip(vor.ridge_points, vor.ridge_vertices):simplex = np.asarray(simplex)if np.any(simplex < 0):i = simplex[simplex >= 0][0]  # finite end Voronoi vertext = points[pointidx[1]] - points[pointidx[0]]  # tangentt = t / np.linalg.norm(t)n = np.array([-t[1], t[0]])  # normalmidpoint = points[pointidx].mean(axis=0)far_point = vor.vertices[i] + np.sign(np.dot(midpoint - center, n)) * n * 100plt.plot([vor.vertices[i, 0], far_point[0]],[vor.vertices[i, 1], far_point[1]], 'k--')
plt.show()

此段代码为画出图1中的虚线,不做详解。

此文主要为了解释vor.vertices,vor.regions,vor.ridge_vertices,vor.ridge_points四个参数里面存储的是什么索引,当弄清楚这4个参数的存储值,即可明白后面两个循环的意义。

如果有任何疑问或者解释不清楚的地方请在下方留言,本人也是刚开始接触Voronoi图,如果解释不太清楚的地方,敬请留情。

Voronoi入门1相关推荐

  1. 【Python基础】科学计算库Scipy简易入门

    0.导语 Scipy是一个用于数学.科学.工程领域的常用软件包,可以处理插值.积分.优化.图像处理.常微分方程数值解的求解.信号处理等问题.它用于有效计算Numpy矩阵,使Numpy和Scipy协同工 ...

  2. ArcGIS实验教程——实验三十四:ArcGIS地统计分析全解(直方图、正态QQ图、趋势分析、voronoi图、半变异函数、协方差云)

    ArcGIS实验视频教程合集:<ArcGIS实验教程从入门到精通>(附配套实验数据)> 文章目录 一.地统计分析的基本原理 二.地统计分析的工作流程 三.探索性空间数据分析工具 1. ...

  3. faiss python安装_faiss入门

    Faiss入门篇假定Faiss已经被安装,若未安装可参考小编安装编译篇https://zhuanlan.zhihu.com/p/78689463.本篇小编基于Faiss的官方wiki实例展开,旨在让大 ...

  4. ArcGIS10从入门到精通系列实验图文教程(附配套实验数据持续更新)

    文章目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 本教程<ArcGIS从入门到精通系列实验教程>内容包括:ArcGIS平台简介.ArcGIS应用基础.空间数据的采集 ...

  5. OpenCV4 快速入门 (学习笔记 全)

    第1章 基础知识 1.1 基础结构介绍 作者博客https://blog.csdn.net/shuiyixin?type=blog https://blog.csdn.net/shuiyixin/ar ...

  6. Games104现代游戏引擎入门-lecture6游戏中的大气和云的渲染(下)

    Games104现代游戏引擎入门-lecture6游戏中的大气和云的渲染-下 1 大气 1 appearance modeling 2 真实大气层的物理 1 rayleigh Scattering 2 ...

  7. OpenCV4 快速入门笔记

    OpenCV4 快速入门 (学习笔记 全) Excerpt <OpenCV4 快速入门>学习笔记 第1章 基础知识 1.1 基础结构介绍 作者博客https://blog.csdn.net ...

  8. 学生3D打印Voronoi高跟鞋

    2019独角兽企业重金招聘Python工程师标准>>> 三维印刷的鞋子只是不断回到我作为一个话题,似乎.上周的新闻包括耐克和阿迪达斯公司的技术为其业务计划整合的故事.我最近还包括了在 ...

  9. 用Construct 2制作入门小游戏~

    今天在软导课上了解到了Construct 2这个神器,本零基础菜鸟决定尝试做一个简单的小游戏(实际上是入门的教程啊= = 首先呢,肯定是到官网下载软件啊,点击我下载~ 等安装完毕后我便按照新手教程开始 ...

最新文章

  1. 来普及一下Redis主从复制以及主从复制原理
  2. java线程学习-Thread.currentTread().getName()和this.getName()的区别
  3. oracle sql statement ignored,sql – Oracle无效使用类型名称或子类型名称
  4. android蓝牙开启后会尝试自动连接,以编程方式配对后,Android会自动连接蓝牙设备...
  5. java.io.IOException: DerInputStream.getLength(): lengthTag=111, too big解决方法
  6. 画质评测|一次关于视频画质的探(zhǎn)讨(xiàn)
  7. 几个年薪百万的下属,爆了~
  8. 苹果CarPlay新功能上线,老司机们更方便了
  9. javascript面试题(一)
  10. vi/vim编辑器常用命令
  11. [渝粤教育] 兰州城市学院 翻转课堂教学法 参考 资料
  12. 解决xshell flashfxp等工具连接不上本机上的虚拟机
  13. ios 渐变透明背景_2019 - 渐变梯度
  14. css单元格固定宽度大小,超过部分使用省略号表示
  15. c++系统骨干研发进阶的道和术
  16. Delphi操作Word,Excel替换
  17. MSS(Microsoft smoothing streaming)介绍
  18. system call——系统调用
  19. open_source_team
  20. 领悟《信号与系统》之 信号与系统概论

热门文章

  1. 一步一步完成 MIT-6.824-Lab1 : MapReduce 之二
  2. 2013年嵌入式软件开发工程师的薪资水平调查
  3. 《USB开发大全》—USB软硬件开发指南,无可替代的工具书
  4. DFT的对称性与DCO-OFDM、ACO-OFDM
  5. 极客时间和极客学院_如何重置“极客琐事”得分(并减少愚蠢感)
  6. 《苏菲的世界》 ---- 听见
  7. 咸鱼菌玩3D—123D物体操作
  8. Vue中动态渲染输入框并v-model绑定后无法输入
  9. 关于示波器的触发功能
  10. Linux操作ping命令name or service not know解决办法