4

重複の可能性:
2つの線分が交差する場所をどのように検出しますか?

2つの点ab2つのベクトルが与えられ、次の方法で交点である3番目の点を見つけたいと思いvます。uc

vector2 intersection(vector2 a, vector2 v, vector2 b, vector2 u)
{
    float r, s;

    a + r * v = b + s * u;
    r * v - s * u = b - a

    r * v.x - s * u.x = b.x - a.x
    r * v.y - s * u.y = b.y - a.y
}

このシステムを解決するためにガウスの消去法を使用する以外の方法はありますか?それとも、これを処理するための最良の(または少なくとも許容できる)方法ですか?

編集:の定義vector2

typedef union vector2
{
    float v[2];
    struct { float x, y; };
} vector2;

aまた、点とベクトルの唯一の違いは、アフィン変換による変換方法にあるため、bタイプも同じです。vector2

4

2 に答える 2

1

私には割り当ての問題のように見えます。コードの記述に役立つロジックは次のとおりです。

最初のレイをと呼びましょうR0
上の点の軌跡R0は次のように定義されPます。

P = P0 + alpha x V0

2番目の光線の場合R1

P = P1 + beta x V1

それらは交差するはずなので:

P0 + alpha x V0 = P1 + beta x V1

alphabetaは不明であり、x任意のに2つの方程式がありますy

未知数を解き、交点を取り戻します。

すなわち、

P0.x + alpha * V0.x = P1.x + beta * V1.x
P0.y + alpha * V0.y = P1.y + beta * V1.y

alphaとを解きbetaます。

alphaとの両方に真の正の解がある場合beta、光線は交差します。と
の両方に対して実際の、しかし少なくとも1つの負の解がある場合、拡張光線は交差します。alphabeta

于 2013-01-10T11:24:37.933 に答える
1

それは簡単な数学です。

ただし、最初に交差があることを確認してください。両方のベクトルが平行である場合、それを解決できません。

// Edit this line to protect from division by 0 
if (Vy == 0 && Uy == 0) || ((Vy != 0 && Uy != 0 && (Vx/Vy == Ux/Uy)) // => Fail.

次に(計算は長いので表示しませんが、結果は次のとおりです):

R = (AxUy - AyUx + ByUx - BxUy) / (VyUx - VxUy)  
S = (Ax - Bx + RVx) / Ux  

お役に立てば幸いです。

于 2013-01-10T12:04:35.127 に答える