日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Voronoi入门1

發布時間:2023/12/20 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Voronoi入门1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

建議先看一下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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。