質問: 平面座標系で、2 つの線分が与えられ、2 つの線分の端点の座標がわかっている場合、2 つの線分が交差するかどうかを判断しますか? 交差する場合は、交点の座標を見つけます。
まず、下の図に示すように、2 つの線分が交差するすべてのシナリオをリストします。
シナリオは全部で8つ。
これらのシナリオを注意深く分析すると、5 番目、6 番目、7 番目、および 8 番目のシナリオには共通の特徴があることがわかります: 線分の端点の一致があり、残りの 4 つのシナリオは存在しません。
エンドポイントが重複している場合
まず、エンドポイントが重複しているシナリオを分析しましょう。
端点が重複している場合は、残りの端点も等しいかどうかを判断します。
もう一方の端点も等しい場合、それは7 番目のシナリオと見なされます。つまり、2 つの線分は同じ線分であり、完全に重なっています。
他の端点が等しくない場合は、等しくない 2 つの点をベクトルに接続します (下図の 5 番目、6 番目、8 番目のシーンでは、A 点と C 点がベクトルに接続されていることを意味しますが、もちろん、次の図に示すように、図では、一致しない点によって接続された新しいベクトルを示すために赤を使用し、元の線分によって表されるベクトルを示すために緑を使用します)。
次に、ベクトルを元の線分ベクトルのいずれかとクロス乗算します
外積の結果が 0 でない場合は、新しいベクトルが外積に使用される線分と平行でないことを意味するため、5 番目のシナリオであると推測できます。
外積の結果が 0 の場合、新しいベクトルが外積の線分に平行であることを意味します。つまり、6 番目と 8 番目のケースに入ります。
ここで、残りの 2 点が一致点の同じ側にあるかどうか (つまり、図の点 A と点 C が一致点の同じ側にあるかどうか) を点乗算を使用して判断します。一致点をベクトルの末尾、つまり、ベクトルとベクトル(点 B と点 D が一致するため、ベクトル と呼ぶことができます) の合成として点乗算を行います。
内積が 0 より大きい場合は同じ辺、つまり8 番目のシナリオであり、内積が 0 より小さい場合は6 番目のシナリオです。
エンドポイントの重複がない場合
エンドポイントの重複がある状況について説明した後、エンドポイントの重複がないシナリオについて説明しましょう。
まず、2 つの線分のうちの 1 つを基本的な計算ベクトルとして使用します。線分 AB を基本計算ベクトル と仮定すると、別の線分上の 2 つの端点が線分 AB と同一線上にあるかどうかを次のような交差乗算によって順次決定します。
(式にはベクトルも使用できます)、
外積が 0 の場合、点 C が線分 AB と同一線上にあることを意味します。
外積が 0 でない場合、点 C が線分 AB と同一線上にないことを意味します。
同様に、(式中のベクトルもベクトル)は同じで、点Dが線分ABと同一線上にあるかどうかを調べることができます。
同様に別の線分を基本計算ベクトルとして選び、上記の処理を再度実行すると、点Aと点Bの相対位置と線分CDを知ることができます。
2 つの計算結果を組み合わせると、2 つの線分の相対的な位置を知ることができます。
ベクトルに基づいてベクトルを計算すると、線分 AB に対する点 C と D の位置を知ることができます。
ベクトルに基づいてベクトルを計算すると、線分 CD に対する点 A と B の位置を知ることができます。
最初のシナリオの必要十分条件は次のとおりです。
線分 AB は CD が位置する線と交差します。つまり、点 A と点 B はそれぞれ線 CD の両側にあります。
さらに、線分 CD は線 AB と交差します。つまり、点 C と点 D は線 AB の両側にあります。
2 番目のシナリオは、別の線分と同一直線上にある点が 1 つしかない場合です。その場合、同一直線上にある点の座標範囲が線分の 2 つの端点の座標範囲内にあるかどうかを判断するだけで済みます。ポイントは、この共線のポイントです。
3 番目と 4 番目のシナリオは、4 つの点がすべて同一線上にあることを意味するため、各エンドポイントの座標を並べ替えて判断するだけで、それが 3 番目のシナリオか、4 番目のシナリオか、または共通の交点を持たない他のシナリオかどうかを確認できます。
ここまでで、8 つのシナリオすべてを整理しました。全体の流れは以下の通りです。
交点座標の計算
最初のシナリオを除いて、他の 7 つのシナリオは交点と交点間隔を見つけるのが非常に簡単です。最初のシナリオでは、残りの作業は主に交差点の座標を計算する方法です。
まず、図のように、交差する 2 つの線分の端点を結び、元の線分の 1 つを下の線として、もう一方の線分の 2 つの端点がそれぞれ下の線に垂直な高線を作成します。上図、線分ABを底辺とし、h1はC点からAB点までの高さ、h2はD点からAB点までの高さです。
セット,
しかし
交点Oの座標が得られる
これまでのところ、全体的なソリューションのアイデアは完成しています。
今日は2023年の大晦日です。卯年、皆様にとって新しい年となりますようお祈り申し上げます。
忘れていなければ、後でコードを追加します。