泰森多邊形又叫馮洛諾伊圖(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。
希望能幫到大家,歡迎任何指正和意見。