![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
線分の交差判定についてネットで調べていたら、以下のような処理で
できると書かれていたページがあったのですが、どうしても理解する事が
できません。
もしできれば、解説を頂いてもいいでしょうか。
よろしくお願いします。
//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;//交差
}
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
はじめまして。
こういった図を見ながらでないとわかりづらい問題は、
書籍をあたったほうがわかりやすいかと思います。
プログラミング関係の本にまじって「~数学」などという本がいくつか
あるはずなのでそれを見るのがよいと思います。
WEB上でしたら以下のURLがお勧めです。
参考URL:http://www12.plala.or.jp/ksp/mathInPhys/index.html
No.3
- 回答日時:
No.1です。
とりあえず、1つだけ。
> なぜfDenoが0の時並行なのか、
ベクトルなのですが。
Aのx成分とy成分、Bのx成分とy成分を考えると
平行→傾きが同じ ということから
Aのy成分/Aのx成分=Bのy成分/Bのx成分が成立します。
これを整理するとfDeno=0の式になります。
あとは考えてください。
No.2
- 回答日時:
最初の二つの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で、
それぞれの線分中で交差しているかどうかの値を出す事が
できるのですか?
下の方の回答と同じ補足で申し訳ありませんが、もしよければ
教えて頂けますでしょうか?
No.1
- 回答日時:
次の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で、
それぞれの線分中で交差しているかどうかの値を出す事が
できるのですか?
もしよければ教えて頂けますでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 工学 非対称三相交流について 2 2022/07/06 00:36
- 物理学 高1力学の運動量の問題です。問題を一通り解いたのですが、行き詰まってしまったのでご回答頂ければ嬉しい 3 2022/06/29 11:20
- 物理学 Va=1/4πε × (q1/a + q2/b + q3/c) Vc=1/4πε × (q1+q2+ 2 2023/04/16 14:08
- JavaScript 追加ボタンを押した際に ok ボタンを押した場合のみ入力値が追記されるようにしたいです 6 2022/05/29 09:57
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- Visual Basic(VBA) C3とC4のセルに、Visual basicで実行した時入力した値をC3に表示させ、その後に、C3に 1 2023/07/14 09:43
- 地図・道路 バイク 右折時に中央線に寄るタイミング 2 2022/08/28 10:27
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
直線上にある点の座標の求め方
-
3次元空間上の2つの座標から...
-
円弧の描画について
-
3次元空間における平行回転移動...
-
ダイアログ内コントロールの位...
-
空間上の二点を結ぶ直線上に任...
-
ワード上Shapeの位置情報を統一...
-
ブロック図を作成するソフト
-
閉図形の座標の配列が右回りか...
-
iPhoneの設定について
-
以下のプログラムは重心を求め...
-
エクセルで回転する座標の出し方
-
VB.net フォームをなめらかに移...
-
最小二乗平面
-
Excel VBA で自在に図形を変化...
-
図面の拡大、縮小
-
ピクチャボックスの座標取得
-
当たり判定後に面に沿って動か...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
エクセルである点からの距離で...
-
エクセルで回転する座標の出し方
-
3次元空間上の2つの座標から...
-
始点、終点の二つの座標と半径...
-
c言語でキーボードから2点の座...
-
閉図形の座標の配列が右回りか...
-
以下のプログラムは重心を求め...
-
交差する2線分の交点座標の求め方
-
y=x^2の座標をプロットするプロ...
-
ダイアログ内コントロールの位...
-
シーケンサー(PLC?)で制...
-
ガウシアンフィルタのCプログラム
-
多角形の内部かどうか判定する方法
-
直線上にある点の座標の求め方
-
エクセルシート上のマウスポイ...
-
OpenCvSharp4による画像判定解...
-
C言語 配列で座標
-
ピクチャボックスの座標取得
おすすめ情報