-PR-
解決済み

2線の交点を座標値で求める式で、0での除算が発生しない方法を教えて下さい。

  • 困ってます
  • 質問No.28994
  • 閲覧数649
  • ありがとう数11
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 65% (13/20)

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
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル14

ベストアンサー率 57% (1014/1775)

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用のプログラムを自作していらっしゃるのかな?線形代数を学んでおくととても便利ですよ。
お礼コメント
lible_io

お礼率 65% (13/20)

毎度お世話様です。

実に解かり易い回答有り難うございます。
現在、CADを組んでおりまして条件処理を行えばなんとかなるのですが
デバックの際ややこしくなって困っていました。

将来は、CGの方にも進むつもりです。
線形代数ですか、今度調べてみます。

又、質問しますのでよろしくお願いします。
投稿日時 - 2001-01-17 20:42:37
関連するQ&A
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル10

ベストアンサー率 51% (86/168)

これは、直線の式を  y=ax+b としてそれぞれの傾きaを求めているのですね。 この y=ax+b という式が、すでにx軸に垂直な直線に対応していません。 (yの係数を0にすることが出来ませんね。) より一般的には、まず最初に  ax+by+c=0 で平面上での直線をあらわしておきましょう。 質問の数値を用いて具体的に計算してみます。  直線A:ax+by+c=0  直線B:a& ...続きを読む
これは、直線の式を
 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) と求まります。
お礼コメント
lible_io

お礼率 65% (13/20)

回答有り難うございました。
解かり易い回答なのですが、プログラムの中でそのまま使える式を
期待していました。

怠け者で、すみません。
又、質問しますのでよろしくお願いします。
投稿日時 - 2001-01-17 20:44:07


  • 回答No.2
レベル10

ベストアンサー率 44% (81/181)

 lible_ioさん、前回の続きですか?  解決方法は簡単、簡単。傾きを求める前に、線a、線bにおいてx座標をチェックするだけです。ちなみに、もし等しければ求める交点のx座標はその値で決まりです。例えば、次のようにすればいかがですか?  if (ax1==ay1)  {   if (bx1==bx2)   {    交点なしの処理   }   else   {    X=ax1 ...続きを読む
 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を求める処理
   }
  }
 }

 見落としがあるかもしれません。ご自分でも、よく考えてみてくださいね。
お礼コメント
lible_io

お礼率 65% (13/20)

毎度お世話様です。

条件分岐で処理をして見たのですが、式の中で線角度が必ず必要になるため
計算結果が正しく出ない事があり、デバックもややこしいため別の式がないか
質問してみました。

stomachmanの回答でOKのようです。
又、お願いします。
投稿日時 - 2001-01-17 20:43:27
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ