- ベストアンサー
2線の交点を座標値で求める式で、0での除算が発生しない方法を教えて下さい。
2線の交点を座標値で求める式で、0での除算が発生しない方法を教えて下さい。 座標 線a ax1 = 0 , ay1 = 0 : ax2 = 12 , ay2 = 13 線b bx1 = 6 , by1 = 15: bx2 = 6 , by2 = 2 A=(y13-y0)/(x12-x0) B=(y2-y15)/(x6-x6) 0で除算が発生 X=(A*x0-y0-B*x2+y15)/(A-B) Y={A*y15-B*Y0+AB*(x0-x2)}/(A-B) 片方の線が垂直だと0で除算が発生してしまいます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
d = (ax1-ax2)(by2-by1)-(bx1-bx2)(ay2-ay1) x = {(bx1by2-bx2by1)(ax1-ax2)-(ax1ay2-ax2ay1)(bx1-bx2)}/d y = {(ax1ay2-ax2ay1)(by2-by1)-(bx1by2-bx2by1)(ay2-ay1)}/d です。 ●準備:交点を求めようと言うのですから、 (1)「(ax1,ay1),(ax2,ay2) が(点ではなく)直線であり、(bx1,by1),(bx2,by2) が直線である」つまり (ax1 ≠ ax2 または ay1 ≠a y2)でありしかも(bx1 ≠ bx2 または by1 ≠b y2) でなくては話にならない。さらにまた、 (2) これら2本の線が平行であっても意味がありません。 以上の条件(1)(2)は、実はベクトル<(ax1-ax2),(ay2-ay1)>と<(bx1-bx2),(by2-by1)>との外積dが0ではない、ということ、言い換えれば d = (ax1-ax2)(by2-by1)-(bx1-bx2)(ay2-ay1) が0でない、という事と等価です。 ●次に、2本の直線の方程式は (ay2-ay1) x + (ax1-ax2) y = (ax1ay2-ax2ay1) (by2-by1) x + (bx1-bx2) y = (bx1by2-bx2by1) と書くことが出来ます。これを解くと x = {(bx1by2-bx2by1)(ax1-ax2)-(ax1ay2-ax2ay1)(bx1-bx2)}/d y = {(ax1ay2-ax2ay1)(by2-by1)-(bx1by2-bx2by1)(ay2-ay1)}/d です。(1)(2)の条件さえ満たしていれば、必ずd ≠0ですから、0によるわり算は生じません。 ●なお、以上は行列を使った計算(線形代数)の基本を普通の数式に書き直したものです。もしかしたらCG用のプログラムを自作していらっしゃるのかな?線形代数を学んでおくととても便利ですよ。
その他の回答 (2)
- TCM
- ベストアンサー率44% (81/181)
lible_ioさん、前回の続きですか? 解決方法は簡単、簡単。傾きを求める前に、線a、線bにおいてx座標をチェックするだけです。ちなみに、もし等しければ求める交点のx座標はその値で決まりです。例えば、次のようにすればいかがですか? if (ax1==ay1) { if (bx1==bx2) { 交点なしの処理 } else { X=ax1 Yを求める処理 } } else { if (bx1==bx2) { X=bx1 Yを求める処理 } else { Aを求める処理 Bを求める処理 if (A==B) { 交点なしの処理 } else { 通常の方法でX,Yを求める処理 } } } 見落としがあるかもしれません。ご自分でも、よく考えてみてくださいね。
お礼
毎度お世話様です。 条件分岐で処理をして見たのですが、式の中で線角度が必ず必要になるため 計算結果が正しく出ない事があり、デバックもややこしいため別の式がないか 質問してみました。 stomachmanの回答でOKのようです。 又、お願いします。
- guiter
- ベストアンサー率51% (86/168)
これは、直線の式を y=ax+b としてそれぞれの傾きaを求めているのですね。 この y=ax+b という式が、すでにx軸に垂直な直線に対応していません。 (yの係数を0にすることが出来ませんね。) より一般的には、まず最初に ax+by+c=0 で平面上での直線をあらわしておきましょう。 質問の数値を用いて具体的に計算してみます。 直線A:ax+by+c=0 直線B:a'x+b'y+c'=0 として、数値を代入すると 直線Aに対して c=0 …(1) 12a+13b+c=0 …(2) という連立方程式を得ます。 また、直線Bに対して 6a'+2b'+c'=0 …(3) 6a'+15b'+c'=0 …(4) という連立方程式を得ます。 それぞれ文字数3に対して式が2つしかないので a,b,c 等の値は 1つには決まりませんが比を求めることが出来ます。 最も簡単な整数比を用いると 式(1)、(2)から a:b:c=13:-12:0 式(3)、(4)から a':b':c'=1:0:-6 となります。つまり、 直線A:13x-12y=0 直線B:x-6=0 となります。 よって、交点は (x,y)=(6,13/2) と求まります。
お礼
回答有り難うございました。 解かり易い回答なのですが、プログラムの中でそのまま使える式を 期待していました。 怠け者で、すみません。 又、質問しますのでよろしくお願いします。
お礼
毎度お世話様です。 実に解かり易い回答有り難うございます。 現在、CADを組んでおりまして条件処理を行えばなんとかなるのですが デバックの際ややこしくなって困っていました。 将来は、CGの方にも進むつもりです。 線形代数ですか、今度調べてみます。 又、質問しますのでよろしくお願いします。