オンライン健康相談、gooドクター

線分の交差判定についてネットで調べていたら、以下のような処理で
できると書かれていたページがあったのですが、どうしても理解する事が
できません。

もしできれば、解説を頂いてもいいでしょうか。
よろしくお願いします。

//2次元での線分と線分の交差判定と交点
BOOL CheckCrossLine(CONST D3DXVECTOR2* pvA1,
          CONST D3DXVECTOR2* pvA2,
          CONST D3DXVECTOR2* pvB1,
          CONST D3DXVECTOR2* pvB2,
          D3DXVECTOR2* pvOut)
{
D3DXVECTOR2 v1 = *pvA1 - *pvB1;
D3DXVECTOR2 vA = *pvA2 - *pvA1;
D3DXVECTOR2 vB = *pvB2 - *pvB1;

if (*pvA1 != *pvA2) ;
else return FALSE;//線分が点のときは交差していないとする

if (*pvB1 != *pvB2) ;
else return FALSE;//線分が点のときは交差していないとする

FLOAT fDeno = vA.x * vB.y - vA.y * vB.x;//外積の長さ

//分母が0で、平行なときは
if (fDeno != 0.0f) ;
else return FALSE;//交差していないことにする

FLOAT t = (v1.y * vB.x - v1.x * vB.y) / fDeno;
FLOAT s = (v1.y * vA.x - v1.x * vA.y) / fDeno;

if (t < 0.0f || t > 1.0f || s < 0.0f || s > 1.0f)
return FALSE;//交差していない
else {
//交点を返す
pvOut->x = vA.x * t + pvA1->x;
pvOut->y = vA.y * t + pvA1->y;
return TRUE;//交差
}

gooドクター

A 回答 (4件)

はじめまして。


こういった図を見ながらでないとわかりづらい問題は、
書籍をあたったほうがわかりやすいかと思います。
プログラミング関係の本にまじって「~数学」などという本がいくつか
あるはずなのでそれを見るのがよいと思います。
WEB上でしたら以下のURLがお勧めです。

参考URL:http://www12.plala.or.jp/ksp/mathInPhys/index.html
    • good
    • 0

No.1です。



とりあえず、1つだけ。

> なぜfDenoが0の時並行なのか、

ベクトルなのですが。
Aのx成分とy成分、Bのx成分とy成分を考えると
平行→傾きが同じ ということから
Aのy成分/Aのx成分=Bのy成分/Bのx成分が成立します。
これを整理するとfDeno=0の式になります。

あとは考えてください。
    • good
    • 0

最初の二つのifはいいですね?


二つの線分のうち、どちらかの両端が同じ点(=線分が点)のときは
交差していないと「定義」しています。

次のif文は、二つのベクトルの平行条件です。
http://aozoragakuen.sakura.ne.jp/taiwaN/taiwaNch …
平行な二直線は当然、交差しませんね。

ここまでで、二直線は平行ではない=どこかで交差する、となります。
しかし、線分が交差するためには、交点がそれぞれの線分中になければいけません。
その判定が最後のif文です。
tとsがどのような値になるか、実際に計算して確かめてみてください。

この回答への補足

ご回答いただきありがとうございます。

どういう判定をしているかよく分かる事ができました。

ただ、なぜfDenoが0の時並行なのか、
(v1.y * vB.x - v1.x * vB.y) / fDenoや、
(v1.y * vA.x - v1.x * vA.y) / fDenoで、
それぞれの線分中で交差しているかどうかの値を出す事が
できるのですか?

下の方の回答と同じ補足で申し訳ありませんが、もしよければ
教えて頂けますでしょうか?

補足日時:2006/05/31 15:27
    • good
    • 0

次の4つに分けて考えます。


1.どちらかが点・・ダメ
2.平行・・ダメ
3.線分が重なる・・OK
4.延長すれば重なる・・ダメ

線分を単純な数式で扱うのは無理なのでとりあえず直線として交点を求めます。

すると3と4が混じるので交点が両方の線分上にあるかどうかを
チェックして4を除外します。

この回答への補足

ご回答いただきありがとうございます。

どういう判定をしているかよく分かる事ができました。

ただ、なぜfDenoが0の時並行なのか、
(v1.y * vB.x - v1.x * vB.y) / fDenoや、
(v1.y * vA.x - v1.x * vA.y) / fDenoで、
それぞれの線分中で交差しているかどうかの値を出す事が
できるのですか?

もしよければ教えて頂けますでしょうか?

補足日時:2006/05/31 15:27
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

gooドクター

人気Q&Aランキング