2本の線が向いている、または向いている場合、どのように計算しますか?


10

2つのラインセグメントを表す4つのポイントが与えられた場合、ラインAがラインBに向かっているか、またはラインBから離れているかをどのように計算しますか?

2本の線は固定長で、x1 / y1からx2 / y2までの距離として測定できます。

ここに画像の説明を入力してください


ベジェ曲線の場合と直線の場合の違いは何ですか?他の線を完全に囲むことができる曲線がありますか(すべての方向が「方向」を指すように)?
bummzack

1
おそらく、用語を明確にする必要があります。ジオメトリでは、「線」は半直線またはセグメントとは対照的に、どちらかの方向に無限に伸びるので、2つの線は、平行でない限り常に交差します。あなたはどちらを求めていますか?あなたは矢印を描きました。これは方向を意味し、私にとってはセグメントまたはせいぜい半直線を意味します。そして、あなたの「向かって」と「離れて」の定義は何ですか?
ハックワース

ベジエ曲線は、光線との交差テストを解くために必要な等式で表現するのが難しい場合があります。ちなみに、矢を表す言葉を「光線」に変えます。あなたはより速い応答を得るかもしれません。昼食の時間があれば、他に誰もいなければ答えます。そうでない場合、これはゲームで非常に一般的なタスクです。Googleの「Ray line segment intersect test」。ベジエ曲線のテストは似ていると思いますが、試したことはありません。
ブランドン、2011

3
質問は2つに分割してください。線分がある部分はとても簡単です。ベジェ曲線のある部分は非常に複雑で、近似的な数値解しかない。
sam hocevar

質問に応じて質問を2つに分割しました。第二の部分はここにある:gamedev.stackexchange.com/questions/21463/...
Robinicks

回答:


11

ましょうAB黒のライン上の2点とします。ましょうCDあなたの青のセグメントで。z外積の座標の符号は、黒い線の「左」か「右」AB^ACかを示しますC。同様に、クロス積AB^CDCD、黒い線の「左」または「右」を操縦するかどうかを示します。

左か右かを知りたくありません。必要なのは、それらが同じ方向または反対方向であることを確認することです。そのため、2つの値を乗算します。

したがって、次の疑似コードが機能するはずです。

z1 = (xB-xA)*(yC-yA) - (yB-yA)*(xC-xA);
z2 = (xB-xA)*(yD-yC) - (yB-yA)*(xD-xC);
z3 = z1 * z2;

if (z3 < 0)
    ; /* Pointing towards (BUT maybe even crossing) */
else if (z3 > 0 || z2 != 0)
    ; /* Pointing away */
else
    ; /* Parallel */

ベジェ曲線の適切な解決策を書くには少し時間がかかると思います。次の状況は、向こう側ですか?

問題?


曲線については、線分に最も近い点で曲線の接線を見つけ、これを他の線分をテストするのと同じ方法で使用できると思います。おそらく
思った

@stephelton:ベジエ曲線の2番目の画像をもう一度見て、離れる方向に曲がる曲線を指してください。または、交差する可能性のあるセグメントに平行な接線を持つが、セグメントに向かって湾曲し、交差するカーブを考えてみます。
Cascabel

トロールフェイスの+1と優れた数学:) ただし、実際の「方向」ダイアグラムには実際にはまだ「アウェイ」があります。開始点を線の上に移動するだけです。
ジョナサンディキンソン

@JonathanDickinsonのおかげで、画像を更新して私の質問が少し明確になるようにしました!
sam hocevar

2

始点を緑の円、終点を赤の矢印とする

DSとして開始点と黒いセグメントの間の距離を計算し、DEとして終了点(赤い矢印)に対して同じことを行います。DS> DEの場合、セグメントは向いています。DE> DSの場合、それは逆向きです。両方が等しい場合、2つは類似です。

あなたはセグメントに点からの距離を計算する方法を見つけることができ、ここで、及び二次ベジエ曲線にここに。ただし、ベジェ曲線の形状によっては、奇妙な結果が返される場合があります(曲線自体が交差している場合があります)。


DS> DEは、直線に対してのみ機能することが保証されています。ベジェでは失敗する可能性があります。また、あなたは彼の「向かって」の定義を知りません。矢印の延長が2点で定義された線と交差するが、同じ点で定義された線分と交差しない場合でも、それは「向いている」のでしょうか?
ハックワース

私は線ではなく2つのセグメントについて話しているので、「矢印の延長」はありません。また、ここでは距離について話しているので、矢印がどこを指しているかは関係ありません。黒い線の最も近い点は、黒い線の開始/終了点である可能性がありますが、問題ではありません。2つのセグメントは同一線上にある可能性がありますが、この方法は意図したとおりに機能します。ベジェカーブについては、カーブの形状によっては奇妙な結果が得られることを述べました。
ラバコル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.