スイープラインアルゴリズムを使用した円交差


15

残念ながら、私はまだスイープラインアルゴリズムを理解することにそれほど強くありません。このトピックに関するすべての論文と教科書はすでに読まれていますが、理解はまだ遠いです。それを明確にするために、できるだけ多くの演習を解決しようとしています。しかし、本当に興味深く、重要な仕事は私にとってまだ挑戦です。

全能者ジェフ・エリクソンによる線分交差の講義ノートで見つけた以下の演習。

演習2.スイープラインアルゴリズムを説明および分析して、平面内の円が与えられた場合、2つが交差するかどうかを時間で決定します。各円は、その中心と半径によって指定されるため、入力は3つの配列、およびます。低レベルのプリミティブを正しく実装するよう注意してください。nOnログnバツ[1 ..n]Y[1 ..n]R[1 ..n]

複雑なことをもっと簡単にしよう。円の交差について何を知っていますか?線の交差でどのような類似物が見つかるか。2つの線が隣接している場合に交差する可能性があります。2つの円が交差するためにどのプロパティが必要ですか ましょう、円の中心間の距離である及び円の中心。いくつかのケースを考慮してください。dr0r1

  • ケース1:場合、解は存在せず、円は分離されます。d>r0+r1

  • ケース2:1つの円が他の円に含まれているため、ソリューションはありません。d<|r0r1|

  • ケース3:および場合、円は一致し、解の数は無限になります。r 0 = r 1d=0r0=r1

したがって、交差点の条件は整っているように見えますが、もちろん間違った条件かもしれません。その場合は修正してください。

アルゴリズム。次に、交差する2つの円の間で共通点を見つける必要があります。線の交差点に類似しているため、イベントキューへの挿入条件と削除条件が必要です。イベントポイントが、垂直スイープラインが接触する最初と最後のポイントのx座標であるとします。最初のポイントで円をステータスに挿入 し、最も近い円との交差点をチェックします(チェックの3つのケースについては上記を参照)。最後のポイントでは、ステータスから円を削除します

スイープラインアルゴリズムには十分なようです。何か問題がある場合、または何か別のことを行う必要がある場合は、お気軽にご意見をお寄せください。

補遺

垂直スイープラインが初めて円に触れたときに円を挿入し、スイープラインが最後に円に触れたときにステータスから円を削除します。交差点のチェックは、最も近い前の円に対して行う必要があります。ステータスに円を追加し、前に追加した別の円が既に存在し、それがまだ存在する場合、前の円は「閉じていない」ため、交差点がある可能性があります。


4
全能[引用が必要]
-JeffE

@com「前の最も近い円」とはどういう意味ですか?
ジョー

1
status現在、スイープラインと交差する円を維持していると思いますか?現在に100個の円がありstatus、挿入イベントを処理して101番目の円を挿入するとします。交差点をチェックするためにいくつの円を比較しますか?比較するサークルをどのように選択しますか?
ジョー

@Joe、これはまさに「私が必要とするもので、古典的なスイープラインアルゴリズムのように、「2つの線の交差はある点でこれらの2つの線の隣接を意味する」、円で同様の類似物を見つける必要があります」私が来る最も単純なものであり最小座標とyの最高最低から間隔のそれらの投影交差円場合、円の座標yの最高のyはに交差しなければなりません。だから今、私はあなたの半円のアイデアに近づいているかもしれません。半円の上に最高が含まれていますyyyyyy

回答:


5

あなたは間違いなく正しい軌道に乗っています。大きな問題は、円を挿入するとき、交差点を確認する他の円はどれですか?このチェックはどのように実行しますか?

線分が交差する場合、任意のx座標の線分は完全に順序付けられます。(Y座標の最低から最高までリストできます)。したがって、バイナリサーチツリーでラインセグメントを維持できます。新しいセグメントを追加するときは、バイナリサーチツリーのどこに属しているかを見つけ、その近傍で交差イベントをチェックするだけです。

サークルの場合、どのサークルをチェックするかがすぐにはわかりません。答えが「すべて」である場合、アルゴリズムには何らかの作業が必要です。

線分がそうであるように、完全に順序付けられるように円を表現する方法を見つけられますか?

円を2つの半円として表してみてください。各挿入イベントは、実際には2つのイベントです。上半分を挿入し、下半分を挿入します。


残念ながら、半円のアイデアは得られません。半円を交差可能な円の最小単位と考えてください(交差の3つのケース:交差は上部の半円、下部、またはその両方にあります)。物ggingいでは、すべての円は、左右の境界のx座標によって順序付けられます。したがって、すべての円はすでにx座標順になっているため、statusでx座標を考慮する必要はありません。したがって、(半円の)中心のy座標、またはyと半径の任意の組み合わせを検討する方が論理的に思えます。あなたの意見?
COM

@com独自の交差チェックで行ったように、2つの円が交差するかどうかを判断するには中心点と半径が必要です。y座標と半径だけでは、円の境界を完全に指定することはできません。スイープラインアルゴリズムには、あなたが理解していない基本的なものがあるように見えますが、それが何であるかを伝えるのは難しいです。
ジョー

0

O((n + k)logn)時間で実行されるBentley Ottmannスイープに類似したこのアプローチを考えることができました。

円交差の問題を線分交差に減らすことができました。各円のY軸に平行な垂直直径を考慮します。アルゴリズムは、平面を下から上にスイープする水平線を使用します。

これで、各円の上端点と下端点ができました。また、スイープラインが両方の円を一点で切断する場合にのみ、2つのセグメントが交差するようにIntersection述部を変更する必要があります。

線の交点の問題はO((n + k)logn)時間で解決できるため、円の交点についても同じ境界が続きます。

私はこれがうまくいくと確信していますが、もし皆さんがこれが一般的に処理しないケースを指摘できるなら、私に知らせてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.