SCVT (Spherical Centroidal Voronoi Tesselation) を実装するプログラムを書いています。単位球上に分布する点のセットから始めます (ランダム点または等面積スパイラルのオプションがあります)。数百からおそらく 64K ポイントがあります。
次に、おそらく数百万のランダムなサンプル ポイントを生成する必要があります。各サンプルについて、セット内の最も近いポイントを見つけ、それを使用してそのポイントの「重み」を計算します。(この重みは、別の球面セットから検索する必要がある場合がありますが、そのセットは、アルゴリズムの任意の実行に対して静的なままです。)
次に、元のポイントを計算されたポイントに移動し、プロセスをおそらく 10 回または 20 回繰り返します。これにより、後で使用するボロノイ タイルの中心が得られます。
後で、ユーザーがクリックしたタイルを確認するために、特定のポイントの最近傍を見つける必要があります。これは上記の問題の中で自明に解決され、とにかく超高速である必要はありません。私が効率的である必要があるのは、単位球上の何百万もの最近傍です。ポインタはありますか?
ああ、私は x、y、z 座標を使用していますが、それは決まったものではありません。物事を単純化するように見えます。私も C を使用していますが、これは C に最も慣れているためですが、その選択にも執着していません。:)
サンプル ポイントにスパイラル パターンを使用することを検討しました。これにより、次の検索の良い出発点として、少なくとも最後に見つかったポイントの近傍が得られるからです。しかし、そうすると、どんなツリー検索も役に立たなくなりそうです。
編集:[申し訳ありませんが、タイトルとタグで明確だと思っていました。ランダムポイントを簡単に生成できます。問題は最近傍探索です。すべての点が単位球上にある場合の効率的なアルゴリズムは?]