残念ながら、私はまだスイープラインアルゴリズムを理解することにそれほど強くありません。このトピックに関するすべての論文と教科書はすでに読まれていますが、理解はまだ遠いです。それを明確にするために、できるだけ多くの演習を解決しようとしています。しかし、本当に興味深く、重要な仕事は私にとってまだ挑戦です。
全能者ジェフ・エリクソンによる線分交差の講義ノートで見つけた以下の演習。
演習2.スイープラインアルゴリズムを説明および分析して、平面内の円が与えられた場合、2つが交差するかどうかを時間で決定します。各円は、その中心と半径によって指定されるため、入力は3つの配列、およびます。低レベルのプリミティブを正しく実装するよう注意してください。
複雑なことをもっと簡単にしよう。円の交差について何を知っていますか?線の交差でどのような類似物が見つかるか。2つの線が隣接している場合に交差する可能性があります。2つの円が交差するためにどのプロパティが必要ですか ましょう、円の中心間の距離である及び円の中心。いくつかのケースを考慮してください。
ケース1:場合、解は存在せず、円は分離されます。
ケース2:1つの円が他の円に含まれているため、ソリューションはありません。
ケース3:および場合、円は一致し、解の数は無限になります。r 0 = r 1
したがって、交差点の条件は整っているように見えますが、もちろん間違った条件かもしれません。その場合は修正してください。
アルゴリズム。次に、交差する2つの円の間で共通点を見つける必要があります。線の交差点に類似しているため、イベントキューへの挿入条件と削除条件が必要です。イベントポイントが、垂直スイープラインが接触する最初と最後のポイントのx座標であるとします。最初のポイントで円をステータスに挿入 し、最も近い円との交差点をチェックします(チェックの3つのケースについては上記を参照)。最後のポイントでは、ステータスから円を削除します。
スイープラインアルゴリズムには十分なようです。何か問題がある場合、または何か別のことを行う必要がある場合は、お気軽にご意見をお寄せください。
補遺:
垂直スイープラインが初めて円に触れたときに円を挿入し、スイープラインが最後に円に触れたときにステータスから円を削除します。交差点のチェックは、最も近い前の円に対して行う必要があります。ステータスに円を追加し、前に追加した別の円が既に存在し、それがまだ存在する場合、前の円は「閉じていない」ため、交差点がある可能性があります。
status
現在、スイープラインと交差する円を維持していると思いますか?現在に100個の円がありstatus
、挿入イベントを処理して101番目の円を挿入するとします。交差点をチェックするためにいくつの円を比較しますか?比較するサークルをどのように選択しますか?