ボロノイ図を計算するためにフォーチュンのスイープライン アルゴリズムを実装しています。私の主な参考文献は、de Berg 氏らによる「Computational Geometry: Algorithms and Applications」です。トピックのカバー範囲は非常に明確ですが、私が自分で解決するのに苦労しているいくつかの小さいながらも重要な詳細を見逃しています。Web でヘルプを検索しましたが、他の Web サイトでは、教科書よりもさらに高度な概要が提供されているか、本で提供されているのとまったく同じ擬似コードが提供されています。
今後の円イベントを検出するために、ビーチ ライン上の 3 つのアークによって決定されるブレークポイントのペアが収束するか発散するかを判断する方法が必要です。決定を下すには、Fortune のアルゴリズムが進行するにつれてブレークポイントが追跡するボロノイ セルのエッジの形状に関する知識が必要になるようです。たとえば、ブレークポイントによってトレースされたエッジの勾配を見つけることができれば、ブレークポイントによって形成された 2 つの線とそれぞれの勾配が交差する場所を計算し、その結果に基づいてそれらが収束するかどうかを判断できます。ただし、斜面に関する情報を取得する方法はわかりません。ブレークポイントの現在の位置のみです。
作業する必要がある唯一の情報は、3 つのサイトの x、y 位置と、スイープラインの現在の y 座標です (水平スイープラインを使用しています)。
実は、収束を判断するためのアイデアが 1 つあります。2 つのサイトがある場合、それらが定義するビーチラインの 2 つのセクション間のブレークポイントは、スイープ ラインの現在の位置によってのみ制御されます。2 つのブレークポイントの位置を記録し、一時的にスイープ ラインを少し進めて、新しい位置を記録することを考えました。通常のボロノイ図のエッジは曲がらないため、ブレークポイントの新しいペア間の距離が古いペア間の距離よりも小さい場合、ブレークポイントは収束します。そうでなければ、それらは発散します。しかし、これは危険であり(常に機能するかどうかはわかりません)、醜いようです。きっともっと良い方法があるはずです。
任意のアイデアを歓迎します。疑似コード (可能であれば C# のような構文) は特にそうです。また、ボロノイ図を取得するために使用できる計算幾何学ライブラリがあることも認識していますが、これは個人的な学習課題であるため、アルゴリズムのすべての部分を自分で実装したいと考えています。