膨大な(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つのスレッドだけが四面体を変更できるようにすることです。