泰森多边形又叫冯洛诺伊图(Voronoi diagram),得名于Georgy Voronoi,是一组由连接两邻点线段的垂直平分线组成的连续多边形组成。一个泰森多边形内的任一点到构成该多边形的控制点的距离小于到其他多边形控制点的距离。(百度百科)
使用 python 的 scipy.spatial.Voronoi 函数可以得到泰森多边形,具体代码如下:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.Voronoi.html
1 from scipy.spatial import Voronoi, voronoi_plot_2d
2 import numpy as np
3 import matplotlib.pyplot as plt
4
5 points = np.array([[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2],
6 [2, 0], [2, 1], [2, 2]])
7 # 计算指定点的泰森多边形
8 vor = Voronoi(points)
9 # 绘制泰森多边形二维图像
10 fig = voronoi_plot_2d(vor)
11 plt.show()
运行结果图片:
之后,得到的结果vor有许多的属性,不太聪明的我研究好久,终于看明白,分享给大家。
vor属性:
- points:计算 Voronoi 的输入点坐标
- vertices:Voronoi 顶点坐标
- ridge_points:在每条 Voronoi 脊线(ridge line)附近的点(points)的索引
- ridge_vertices:构成每个 Voronoi 脊线(ridge line)的 Voronoi 顶点(vertices)索引
- regions:构成每个 Voronoi region 的 Voronoi 顶点(vertices)的索引
- point_region: Voronoi region和输入点(point)相对应索引
- 理解图:
理解顺序:
1. 看 vertices 的值: [array([0.5, 0.5]), array([0.5, 1.5]), array([1.5, 0.5]), array([1.5, 1.5])]
它在上图中橙色字体,它是 Voronoi 的顶点,图上的顺序就是根据这个值的先后顺序得到的。
2. 看 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]]
看它的最大值不超过vertices的个数,并且看解释可以看到它和 vertices 和 voronoi region 有关,我们已经知道 vertices 的值和顺序,于是就可以推出 voronoi region,也就是途中的蓝色字体,其中 -1 表示这个顶点是在泰森多边形外部
3. 看 points 值: [array([0., 0.]), array([0., 1.]), array([0., 2.]), array([1., 0.]), array([1., 1.]), array([1., 2.]), array([2., 0.]), array([2., 1.]), array([2., 2.])]
把它按照顺序标记在图上,也就是上图的紫色字体。
4. 看 point_region 值:[1, 3, 2, 8, 7, 9, 6, 4, 5],你按照紫色的 point 的顺序去看蓝色的 Voronoi region 的数字,就可以知道它们是一一对应的。
5. 看 ridge_points 值:[array([0, 3], dtype=int32), array([0, 1], dtype=int32), array([2, 5], dtype=int32), array([2, 1], dtype=int32), array([1, 4], dtype=int32), array([7, 8], dtype=int32), array([7, 6], dtype=int32), array([7, 4], dtype=int32), array([8, 5], dtype=int32), array([6, 3], dtype=int32), array([4, 5], dtype=int32), array([4, 3], dtype=int32)]
按照每个 points 的索引值,就可以找到 ridge_line 的顺序索引值,上图中是红色字体部分。
6. 看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]]
现在已经得到了 ridge_line 的索引,那么按照这个顺序你去看这条线的两端的端点就明白这个属性的意思啦,存在这个顶点就是vertice相应的索引,不存在就是-1。
希望能帮到大家,欢迎任何指正和意见。