2013-07-14 89 views
3

如何確定,使用Qhull,這維諾細胞(指數)是「正確的」(由「現有的頂點」的)沃羅諾伊和勞埃德鬆弛使用Python/SciPy的

我試圖使用進行限制放寬LLoyds算法和由scipy.spatial Voronoi生成的輸入(它是Qhull的封裝)。

在代碼而言,它看起來像:

points = [n for n in itertools.product(xrange(3),xrange(3))] 
vor = Voronoi(points) 

vor2 = lloyd(vor) # my relaxation function - not relevant to the question 

由代碼產生的輸出圖形看起來確定(見下文) 但在VOR結構中的數據是不夠的,執行勞埃德鬆弛。 這是因爲我應該只移動有效的voronoi單元內的點(圖像中的#4)。另一個應該保持原樣。 Qhull混淆了點/區域的順序,所以我無法估計哪個區域屬於哪個點。

這是問題的圖示:

print vor.vertices 
#[[ 0.5 0.5] 
# [ 1.5 0.5] 
# [ 0.5 1.5] 
# [ 1.5 1.5]] 

print vor.regions 
# [[], [-1, 0], [-1, 1], [1, -1, 0], [3, -1, 2], [-1, 3], [-1, 2], [3, 2, 0, 1], [2, -1, 0], [3, -1, 1]] 

print vor.points 
# [[ 0. 0.] 
# [ 0. 1.] 
# [ 0. 2.] 
# [ 1. 0.] 
# [ 1. 1.] 
# [ 1. 2.] 
# [ 2. 0.] 
# [ 2. 1.] 
# [ 2. 2.]] 
print vor.point_region 
# [1 8 6 3 7 4 2 9 5] 

現在我應該找到某種方式即vor.regions [7]是屬於點vor.points的區域[4]。 如何做到這一點?

Voronoi on 3x3 grid

回答

3

你有region你知道,你做不成point,你知道vor.point_region[point] == region。對於單個region,你可以計算出相應的point爲:

point = np.argwhere(vor.point_region == region) 

您還可以創建一個region_point索引陣列從regions作爲數組找出多個points

region_point = np.argsort(vor.point_region) 
points = region_point[regions-1] 
+0

也許我做不明白你的答案,但當我運行你建議的命令: np.argwhere(vor.point_region == 4) 結果是: 數組([[5]]) 這是不正確的。 :( – Chris

+1

那是因爲你應該運行'np.argwhere(vor.point_region == 7)'。你知道你的區域(7),它是(4)你是後一點,對不對?因爲從獲得區域你只需要做'vor.point_region [4]'。 – Jaime