5

Qhull を使用して、どのボロノイ セル (インデックスによる) が「適切な」(「既存の頂点」で構成されている) かを判断する方法

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 構造体のデータはロイズ緩和を実行するのに十分ではありません。これは、有効なボロノイ セル (画像の #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] に属する領域であることがわかります。これを達成する方法は?

3x3 グリッドのボロノイ

4

1 に答える 1

6

あなたにはregion知っていること、知らpointないこと、そして知っていることがありますvor.point_region[point] == region。単一regionの の場合、対応するものを次のように把握できますpoint

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

region_pointインデックス配列を作成してpoints、配列から複数を計算することもできますregions

region_point = np.argsort(vor.point_region)
points = region_point[regions-1]
于 2013-07-14T12:32:10.223 に答える