ボックス内の領域のボロノイ図を計算する


8

私は次のような問題に直面しています。特定の未知の分布を持つポイントでいっぱいのボックスがあり、そのボロノイ図を計算したいと思います。問題は、ポイントの数が非常に多いため、完全な配布ではこれを実行できない場合があることです。

そのため、ポイント数がそれほど多くないボックス内の領域のみにそれを行うことを計画しました。そのためには、そのボックス内の特定の小さな領域のボロノイ図に影響を与える可能性のある最小領域を計算する方法を知る必要があります。

言い換えれば、以下の図の小さな立方体の内側の点のボロノイ図を計算し、メモリ上で可能な最小のボロノイ図を格納するフルボックスの点を持つボロノイ図に適合するようにします。

問題の説明。


3
私は、特に天体物理学において、巨大な点集合のボロノイ分割を計算している人々を見てきました。Volker Springelの作品をご覧ください。たとえば、github.com / regonzar / paravtにもオープンソースコードがあります。参照してくださいarxiv.org/abs/1601.06429
cfdlab

小さな立方体の戦略を使用してそれを行うにはまだいくつかの方法が必要ですが、どうもありがとうございました。見てみましょう。
ccorbella

1
申し訳ありませんが、この文章を理解しようとして問題が発生しました。「最小のボロノイ図を格納するフルボックスのポイントを持つボロノイ図に適合する下の図の小さな立方体内のポイントのボロノイ図を計算したいです。メモリ上で可能です。」
nicoguaro

申し訳ありませんが、これは小さな立方体のボロノイ図を計算することを意味します。これは、ボックスのすべてのポイントを使用して計算した場合に取得する図と同じ領域であることを考慮に入れています。そうするために、ボックス内にあるポイントよりも多くのポイントが必要になると予想します(そうでない場合、そこで同じ戦略に従うと、別のキューブに適合しないと思います)が、できるだけ少なく保存したいポイント。
ccorbella

@ccorbella回答ではありませんが、この素晴らしい図を提供したツールを教えてください。多分キャプションにツールを追加します。
Jan Hackenberg

回答:


2

膨大な(1億を超える)ポイントセットのボロノイ図を計算するには、次のアルゴリズムを使用できます。

1) create a kd-tree with all the points
2) for each point p [in parallel optionally]
     N = 10
     while not finished
       compute the N nearest neighbors of the point p
       compute the intersection of the N half-spaces defined by p 
       and the neighbors
       if there is a neighbor further away than 
         twice the radius of the ball centered on p and 
         bounding the intersection, finished = true
       N = N * 1.5
  // when exiting the loop, the computed intersection 
  // corresponds to the Voronoi cell of p, because no other bisector
  // can contribute to the Voronoi cell.

アルゴリズムについては、私の記事で詳しく説明しています。データの依存関係がないため、簡単に並列化できます(メインループの前に「#pragma omp parallel for」を追加するだけです)。これは、私のGEOGRAM C ++プログラミングライブラリに実装されています(メモリ効率の高いKd-Treeと合わせて、1億を超えるポイントまで拡張できます)。GEOGRAMには、最大1億のサイトで適切に機能するパラレル標準Delaunay / Voronoi実装もあることに注意してください。

古典的な(Boywer-Watson)アルゴリズムの並列実装については、GEOGRAM実装がここに文書化されています(関連するc ++ソースファイルにも広範なコメントがあります)。私はそれについて公開された記事を持っていません、時間が許せば私はそれを書きます。主なアイデアは、四面体に関連付けられたスピンロックを使用して、1つのスレッドだけが四面体を変更できるようにすることです。


まず、お返事ありがとうございます。記事がアップロードされていないようです(少なくとも、リンクしたWebの完全版)。とにかく、あなたはそのボロノイ図アルゴリズムをどのように並列に実装するのですか?
ccorbella 16

お知らせいただきありがとうございます。リンクを修正しました(新しいリンクにはPDFが含まれています。PDFアイコンをクリックして取得してください)。Delaunayの並列実装への短い説明/リンクも追加しました。
BrunoLevy 16

注:ポイントが均一に分散されていれば、うまく機能します(ポイント密度の変動が大きい場合、パフォーマンスが低下する可能性があります)。
BrunoLevy

2

専門家があなたの質問に答えていないようですので、私はアイデアを提供しようとします。しかし、その前に、すでに開発されているいくつかの高度な方法について文献を調べることを強くお勧めします。ただし、これが良い、または高速で効率的な提案であることを保証せずに、次の方法論を提案します。覚えておいてください、私はいくつかの間違いをした可能性があるため、すべてが完全に正しいことを保証するものではありませんが、この方法のアイデアが問題の解決に役立ついくつかのアプローチを提供してくれることを願っています。

VCVCCVC=VC.VC=VC

Vor(VC)vVCVor(v)W(v)vVCW(VC)=vVCW(v)Vor(VC)

VCW(VC)

wW(VC)wwwVCw

wCw

CVw

wVVVCw

vVCW(v)vv

VC

Vor(VC)CVor(V)C

VCVor(VC)VCW(VC)

これがお役に立てば幸いです。


1

これを行う最も簡単な方法は、少なくとも内側のボックス内のポイントの最も近いすべての近傍を含む大きなボックスで内側のボックスを囲むことです。内部ボックスが周囲のデータボックスの端に近い場合に問題が発生することに注意してください。外部ポイントがないためです。

Voronoi / Delaunayテッセレーションの計算は、想像よりも微妙な場合があります。問題の1つは、点がテッセレーション平面/ラインの片側にあるのか他にあるのかを正確に決定する方法です。

これを行うための完全な「CGAL」C ++ライブラリがhttp://www.cgal.org/にあります。私の同僚と私は、これを天体物理学のいくつかの公開された論文で使用しました。これらのテッセレーションを作成する際のすべての潜在的な落とし穴に対処することは、確かなようです。


ご回答どうもありがとうございました。次に、必要に応じて、「最小の数の計算を行う立方体の内部にあるものの最近傍点を見つける方法」のように、私の質問を書き直す必要があります。私の問題は基本的にその問題でした。そうする方法を知っていますか?
ccorbella

外箱の大きさはどうやって決めるのですか?十分に大きくない場合、図全体を元の小さなボックスに制限できない場合があります。ローカルダイアグラムからのボロノイセルの頂点はグローバルダイアグラムの頂点です。つまり、ローカルボロノイダイアグラムの将来の再計算によって変更されない頂点は、内部かどうかに基づいています。対応するdelaunay球のには、ポイントのセット全体からのポイントが含まれるかどうかにかかわらず、これはまさに、ボロノイセルに対してデュアルであるdelaynayセルの定義です。
未来学者

@ConradCorbellaBagot大きなn次元データセットの最近傍を計算するために、非常に効率的なアルゴリズムが存在します。多分あなたはあなたが本当に興味を持っていることを述べたいと思うでしょう。
BORT

ボロノイ/ドロネーテッセレーションは、無限点セットと有界ポイントセットの両方で適切に定義されていますが、より大きなセットの点のサブセットでは定義されていません。そのようなサブセットについては、任意の妥協決定を行う必要があります。それ以外の場合は無限の宇宙に有限のボックスがある宇宙論では、周期的な境界条件を選択します。画像の一部で画像分析を行うとき、境界を定義する点の最初の最も近い近傍で境界を「ドレスアップ」します(考慮すべき複雑な点があります)。私は次の最も近い隣人に行くことは比較的小さな利益をもたらすことがわかりました。
JonesTheAstronomer

ジャーナルとarXivの両方から無料でダウンロードできるadsabs.harvard.edu/abs/2011MNRAS.416.2494Pに、このいくつかの詳細な説明があります。また、これらのテッセレーションを使用した密度場の非線形クリギング再構成についても説明しています。ここのデータソースは天文学ですが、議論は非常に一般的です(3次元データセットの場合)。
JonesTheAstronomer

1

私はあなたの質問を次のように理解しています:ポイントの完全なセットを検討したときに得られるものと同じになるように、ポイントのサブセットに対してボロノイ図を描きたいです。ボロノイ図は、最初に隣接する点を結合し、次に線分に垂直な平面を中点で描くことによって描画されます。これをすべての最近傍に対して行い、点の近傍にボロノイ図を作成します。これをすべてのポイントに対して実行すると、すべてのポイントのボロノイ図が作成されます。ボロノイ図はローカルに定義されています。2番目の最近隣効果または3番目の最近隣効果はありません。最初の最近隣効果のみ。したがって、点のサブセットを含むボロノイ線図を取得するために必要なのは、対象のサブ領域内の点を特定し、それらをそれぞれの最近傍点すべてに接続することだけです。これらの線分の中点を通り、線分に垂直な平面を描きます。この図は、サブリージョンでも完全なリージョンでも、ローカルリージョンで同じです。


2つの質問。まず、「2番目に近い隣人または3番目に近い隣人の効果がある」は「ない…」であるべきですよね?
ccorbella

はい。指摘いただきありがとうございます。答えを更新します。2つ目の質問は何ですか。
Kaustubh Kaluskar 16

申し訳ありませんが、コメントxDDを編集していました。もう1つは、ボロノイ図がローカルで定義されていることを知っています(他の条件下では、私の質問には回答がありません)。私の質問は、必要に応じて、「最小数の計算を行うキューブの内部にあるものの最近傍点を見つける方法」のように書き直す必要があります。そうする方法を知っていますか?とにかく、ありがとうございました。
ccorbella

1
私は、MATLABでknnsearch関数を使用しています。私の典型的なデータセットは約150万ポイントで、ラップトップでそれを行います。Mathworks Webサイトから: 'IDX = knnsearch(X、Y)は、Yの各点についてXの最近傍を検索します。IDXは、私の行を含む列ベクトルです。IDXの各行には、Yの対応する行のXの最近傍のインデックスが含まれています。ここで、Xは完全なデータセットで、Yはキューブ内のポイントです。
Kaustubh Kaluskar 16

まずは改めてありがとうございました。このような膨大な数のポイントでアルゴリズムをkdツリーとして実行できるかどうか確信が持てないので、「大きな次元(20はすでに大きい)の場合、これは予期しないブルートフォースよりも大幅に高速に実行されます。高次元の最近傍クエリは、コンピュータサイエンスにおける重大な未解決の問題です。」...
ccorbella

-2

Grasshopper for Rhinoceros3Dを使用して、視覚的で直感的なアプローチを取ることをお勧めします。Rhinocerosは商用CADパッケージであり、Grasshopperはそのプラグインですが、プラグインを無料で無制限に実行して実験を行うことができます(ライセンスのないRhino3DはRhinoファイルの保存のみを制限します)。Grasshopperには、キャンバスで使用される多数の数学関数が含まれており、3Dボロノイ図はその1つです。 Rhino3DのGrasshopper3Dで実行されたボロノイキューブ


2
リンクは興味深いですが、これは質問の答えにはなりません。
BrunoLevy 16

それは私が求めていたものではありませんでしたが、ツールをありがとうございました。
ccorbella 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.