プログラムを組んでいるのですが、困っています。

2線の斜線が、交差する点の求め方を教えて下さい。

A 回答 (6件)

 J-Jさんのご回答で求めることができますよね。


 ただし、これが「一般の2直線の交点を求める」ということであればもう少し慎重になる必要があります。問題を整理して、
 直線a:点a1(Xa1,Ya1)と点a2(Xa2,Ya2)を結ぶ直線
 直線b:点b1(Xb1,Yb1)と点b2(Xb2,Yb2)を結ぶ直線
とします。すると直線の傾きは、
 直線aでは A=(Ya2-Ya1)/(Xa2-Xa1)、
 直線bでは B=(Yb2-Yb1)/(Xb2-Xb1)
ですが、それぞれXa2=Xa1、Xb2=Xb1のときに零による除算が発生します。これを事前にチェックして対応する必要があります。
 さらに直線の傾きが等しいとき(A=B)についても同様のことが言えます。もっともこの場合には交点なしというコードを返すようにしないといけませんが。
 さらにさらに、これが直線ではなくて「2線分の交点を求める」という問題ならば、求めた交点が線分上にのっているかどうかも確認しなければいけません。
 汎用の交点を求める関数を作っておくのも今後のために悪くないと思いましたので蛇足回答をいたしました。
    • good
    • 0
この回答へのお礼

間違いなく計算値と実数値が合いました。
お世話様でした。
又、詳細説明有り難うございます。

又、困った時はよろしくお願いします。

お礼日時:2001/01/07 11:45

ベクトルと外積を使うときれいに解決するという話でしょう。



頂点a,b,cがあるとします。
ベクトルabとacの外積を求めると頂点cがベクトルabに対して右側にあるか
左側にあるかが外積の正負によって判定できます。

これと次のことから直線の交差を判定できます。

直線a1a2と直線b1b2が交わる

頂点a1と頂点a1が直線b1b2をはさんで反対側にある
かつ頂点b1と頂点b2が直線a1a2をはさんで反対側にある。

外積の計算方法はちょっと忘れてしまいました。
すいません。
    • good
    • 0
この回答へのお礼

申し訳ございません。
回答は出ているのですが、質問を閉じるのを忘れていました。

お礼日時:2001/02/17 00:45

コンピュータにやらせるなら、まず傾きを計算させて変数に入れてしまうといいんじゃないですか?


線aの傾きをA=(y13-y0)/(x12-x0)
線b の傾きをB=(y3-y11)/(x7-x4)とおくと、
求める座標(X、Y)は

X=(A*x0-y0-B*x4+y11)/(A-B)
Y={A*y11-B*Y0+AB*(x0-x4)}/(A-B)
で出ると思います。ちゃんと展開して約分すれば簡単になるのかもしれないけど。。。
適当に連立方程式を解いたので、自信はないです。
最後の式はゼロがあったほうが計算し易いのでa1 x0 y0 とb1 x4 y11 を使いましたが、もちろん、a2とb2でもだいじょうぶです。
x0 y0 のところは省いてもいいですが、一般形にならなくなるので一応書いときました。
    • good
    • 0
この回答へのお礼

間違いなく計算値と実数値が合いました。
お世話様でした。

又、困った時はよろしくお願いします。

お礼日時:2001/01/07 11:43

ある直線が点(x1,y1)と点(x2,y2)を通るとき、


y-y1 = (y2-y1)(x-x1)/(x2-x1)
となりますから、これを展開すれば y=ax+b の形に変形できます。
    • good
    • 0
この回答へのお礼

お世話様でした。

又、困った時はよろしくお願いします。

お礼日時:2001/01/07 11:52

#1のpunchan_jpさんの回答どおりだと思うので、計算してみました。



x = - (b1 - b2) / (a1 - a2)
y = (a1*b2 - a2*b1) / (a1 - a2)

ですね。
(中学の教科書に載ってますよ?)

こういうことではないのであれば、補足ください。

この回答への補足

座標値での計算方法を教えて下さい。

値は
線a
a1 x0 y0
a2 x12 y13
線b
b1 x4 y11
b2 x7 y3

補足日時:2001/01/05 21:44
    • good
    • 0
この回答へのお礼

お世話様でした。

又、困った時はよろしくお願いします。

お礼日時:2001/01/07 11:52

平面上での話でしょうか?


その2本の直線はどのように与えられるのでしょう?
y=ax+b の1次式で与えられるとすると、
y=a1x+b1
y=a2x+b2
の交点は、この二つの式を連立方程式と考えて、x,yについて解けば求まります。

この回答への補足

座標値での計算方法を教えて下さい。

値は
線a
a1 x0 y0
a2 x12 y13
線b
b1 x4 y11
b2 x7 y3

補足日時:2001/01/05 21:53
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q直交する2直線

方程式2x^2-3xy+λy^2+5y+μ=0がxy平面上の直交する2直線を表すようにλ,μを定め、この2直線の方程式を求めよという問題なんですが、解き方、考え方が分かりません。
答は λ=μ=-2
  2x+y=2、2y-x=1 です。

直交する2直線が上方程式で表せれるということもよく分からないので、その辺りもよろしかったら教えてください。

Aベストアンサー

直線の式は ax+by+c=0 という風に表す、というのはOKですね。
与えられた式が(ax+by+c)(px+qy+r)=0 とできたとすると
ax+by+c=0 または px+qy+r=0 となり、2つの直線を表すことになります。
ここまでは、may-may-jpさんの回答の通りですが、ただ因数分解できるだけではλとμは特定できません。そこで必要になるのが「直交」の条件です。

直交する条件は2つの直線の傾きの積が-1になることです。
ax+by+c=0 を変形して y=(a/b)x+(c/b) ただし b≠0
同様に px+qy+c=0 を変形して y=(p/q)x+(r/q) ただし q≠0
とすると 傾きはそれぞれ a/b,p/qですか積が-1 すなわち
(a/b)・(p/q)=ap/bq = -1 ∴ ap = -bq が直交条件です。

なお、b=0(q=0)のときは直線はy軸に平行になります。このとき直交する直線はx軸と平行になり、xの係数が0 つまりp=0(a=0) になります。このときもap = -bq (=0)で成り立ちます。

さて(ax+by+c)(px+qy+r)=0 の左辺を展開すると
apx^2+bqy^2+(aq+bp)xy+(ar+cp)x+(br+cq)y+cr=0
となります。(途中の計算はご自分で確かめてください。)
ここで直交条件をみると x^2 とy^2の係数に注目すればよいことが分かります。
与式に戻って、2x^2-3xy+λy^2+5y+μ=0のx^2 とy^2の係数をみれば 2=-λ すなわちλ=-2が求められます。
これを代入して
2x^2-3xy+2y^2+5y+μ=0
これが(ax+by+c)(px+qy+r)=0 の形に因数分解できれば良いわけです。
x^2,y^2,xyの係数に注目すると
(2x+y+c)(x-2y+r)=0 --(*)という形になることは容易に分かります。
あとはx,yの係数から
2r+c=0
r-2c=5
の2式が出ますので、連立方程式を解いて
r=1, c=-2 よってμ=cr=-2
となります。
このrとcを(*)に代入すれば
(2x+y-2)(x-2y+1)=0 となり、直線の式は 2x+y-2=0,x-2y+1=0
と求まります。
答えの2x+y=2、2y-x=1 は上記の式の定数項を移行した形ですね。

直線の式は ax+by+c=0 という風に表す、というのはOKですね。
与えられた式が(ax+by+c)(px+qy+r)=0 とできたとすると
ax+by+c=0 または px+qy+r=0 となり、2つの直線を表すことになります。
ここまでは、may-may-jpさんの回答の通りですが、ただ因数分解できるだけではλとμは特定できません。そこで必要になるのが「直交」の条件です。

直交する条件は2つの直線の傾きの積が-1になることです。
ax+by+c=0 を変形して y=(a/b)x+(c/b) ただし b≠0
同様に px+qy+c=0 を変形して y=(p/q)x+(r/q) ただし...続きを読む

Q斜線A・BにLの距離P点に斜線に直角の線を描く方程式を教えてください。

斜線A・BにLの距離P点に斜線に直角の線を描く方程式を教えてください。
点A(Ax,Ay),点B(Bx,By)を結ぶ線上に、点Aから距離Lの位置、点P(Px,Py)に斜線に直角の線を描く方程式を教えてください。

Aベストアンサー

(1)Pを中心にして半径rの円を描きます。
(2)円と直線ABとの交点をC,Dとし、C,Dを中心とする半径R(R>r)を描きます。
(3)2つの円の交点E、Fを直線で結びます。

直線ABの傾きをmとすると
 m=(Ay-By)/(Ax-Bx)
点P(Px,Py)を通り、直線ABに垂直な直線の方程式は
y=Py+(-1/m)(x-Px)
です。座標を使う場合はこの方が普通です。

Qxy平面において、原点Oを通り互いに直交する2直線

xy平面において、原点Oを通り互いに直交する2直線を引き、直線x=-1および直線x=3√3 との交点をそれぞれP、Qとする。 OP+OQの最小値を求めよ。

Aベストアンサー

原点Oを通り互いに直交する2直線をm,nとしましょうか。交点は4つある。
A: mとx=-1との交点
B: mとx=3√3との交点
C: nとx=-1との交点
D: nとx=3√3との交点
P, Qってどれだよ?というのがソモソモの疑問デスヨネ?
(1) OP+OQがOA+OBのことなのだとすると(直線nには出番がありませんが)、OA+OBの最小値が1+3√3であることは自明。
(2) OP+OQがOC+ODでも同じです。(直線mには出番がありませんで)最小値は1+3√3。
(3) OP+OQがOA+OCのことなのだとすると(直線x=3√3には出番がありませんで)、△OACは直角三角形である。明らかに、直角二等辺三角形の場合にOA+OCが最小になるんで、2√2が答。
(4) OP+OQがOB+OCのことだったら(直線x=-1には出番がありませんで)、(3)と比べて、直角三角形の各辺の長さが3√3倍になるだけなので、(2√2)×(3√3)が答である。
 残る問題は、
(5) OP+OQがOA+ODであるとき。(ま、出題者の意図は専らこれなんでしょうけど、はっきり書いてないと(1)~(4)も省けません。)
 交差する相手の直線を x=-1とx=3√3じゃなくて一般にx=a, x=b (a≠0, b≠0)だとしてみましょう。
 そして、mの方程式を ux + vy = 0 とすると、v=0の場合にはmはx=aともx=bとも交点を持たない。また、u=0の場合にはnがaともx=bとも交点を持たない。だから(5)においては、これらの場合は除外してよろしい。というわけで、mの方程式を
   y = αx (α≠0)
と書いても差し支えない。このときnの方程式は
  y = x/α
です。
  A= (a, aα)
  D= (b, b/α)
であり、原点からの距離は
  OA = |A| = |a|√(1+α^2)
  OD = |D| = |b|√(1+1/(α^2))
である。
OA+OD をfと書くことにすると、
  f = |A|+|D| = |a|√(1+α^2) + |b|√(1+1/(α^2))
である。ここで
  z = α^2
とおくと zは正の実数 (z>0)です。zを使って
  f = |a|√(1+z) +|b|√(1+1/z)
と書き直します。さて、fの極小値を計算する。つまり方程式
  df/dz = 0
を満たすzを計算するわけで、df/dzを計算して方程式に代入すると
  |a|/(2√(1+z)) - |b|/(z^2)/(2√(1+1/z)) = 0
移項して分母を払うと
  |a|(z^2)√(1+1/z) = |b|√(1+z)
両辺を2乗して
  (a^2)(z^4)(1+1/z) = (b^2)(z+1)
つまり
  (a^2)(z^3)(z+1) = (b^2)(z+1)
z>0なので(z+1)で割って
  (a^2)(z^3) = (b^2)
a≠0なので
  z^3 = (b/a)^2
である。ただし、zは正の実数でなくてはならないのでした。
 ところで、aとbは0でない実数でした。なので、a,bを決めるとこの方程式を満たすzはいつも丁度ひとつ存在して、それは
z = ((b/a)^2)の立方根
です。これを
  f = |a|√(1+z) +|b|√(1+1/z)
に代入するとfの極値、つまりfの極小値あるいはfの極大値が得られる。
 ですが、fの極値を与えるzがただ一つしかなくて、しかもz→0やz→+∞のときにfが+∞に発散するんですから、極大なんてそもそも存在しないのは明らか。なので、この計算でfの極小値が得られ、これがfの最小値でもある。

原点Oを通り互いに直交する2直線をm,nとしましょうか。交点は4つある。
A: mとx=-1との交点
B: mとx=3√3との交点
C: nとx=-1との交点
D: nとx=3√3との交点
P, Qってどれだよ?というのがソモソモの疑問デスヨネ?
(1) OP+OQがOA+OBのことなのだとすると(直線nには出番がありませんが)、OA+OBの最小値が1+3√3であることは自明。
(2) OP+OQがOC+ODでも同じです。(直線mには出番がありませんで)最小値は1+3√3。
(3) OP+OQがOA+OCのことなのだとすると(直線x=3√3には出番がありませんで)、△OACは直角三角形であ...続きを読む

Q斜線ABに平行に、Lの距離離れた斜線CDの座標を求める方程式を教えてく

斜線ABに平行に、Lの距離離れた斜線CDの座標を求める方程式を教えてください。
斜線A(Ax,Ay),B(Bx.By)を平行にLの距離離れたC(Cx,Cy),D(Dx,Dy)の座標を求める方程式を教えてください。

Aベストアンサー

つまり、点ABCDで長方形を作るということですね。

線分ABの長さをMとすると、
(Bx-Ax)^2+(By-Ay)^2=M^2

線分ACの長さはLだから、
(Cx-Ax)^2+(Cy-Ay)^2=L^2
線分ABと線分ACは直角だから、
(Bx-Ax)*(Cx-Ax)+(By-Ay)*(Cy-Ay)=0

これらを解くと、
(Cx-Ax)^2*M^2=(By-Ay)^2*L^2
より、
Cx=Ax+(By-Ay)*L/M
Cy=Ay-(Bx-Ax)*L/M
または
Cx=Ax-(By-Ay)*L/M
Cy=Ay+(Bx-Ax)*L/M

点Dの座標は、
Dx=Cx+(Bx-Ax)
Cy=Cy+(By-Ay)

Q2直線が直交するように、A,Bと交点の途中式を教えてください

2直線が直交するように、A,Bと交点の途中式を教えてください

(1) (x-3)/2 = (y+1)/-3 = (z-4)/A , (x+5)/3 = (y+6)/4 = z+B
A.A=6 B=4 交点(1,2,2)

(2) x+3 = (y-1)/2 = (z-7)/A , x/2 = (y-B)/5 = (z+2)/4
A.A=-3 B=7 交点(0,7,-2)

全く分かりません。例が参考にならないのでよろしくお願いします

Aベストアンサー

(1)
(x-3)/2 = (y+1)/-3 = (z-4)/A
の方向ベクトルは(2,-3,A)

(x+5)/3 = (y+6)/4 = (z+B)/1
の方向ベクトルは(3,4,1)
2つの方向ベクトルが直交するから内積=0
(2,-3,A)・(3,4,1)=6-12+A=0 ∴A=6

この時前半の直線は
(x-3)/2 = (y+1)/-3 = (z-4)/6(=kとおく)
媒介変数表現で
x=2k+3,y=-3k-1,z=6k+4…(1)

後半の直線は
(x+5)/3 = (y+6)/4 = (z+B)/1=h
とおけば媒介変数表現で
x=3h-5,y=4h-6,z=h-B…(2)

(1),(2)を連立方程式として解けば交点の座標(x,y,z)とBが求まります。
x=1,y=2,z=-2,B=4,k=-1,h=2
答えのA=6,B=4は合っていますが、交点の座標が正しくないようです。
正しい交点は(1,2,-2)です。
確認してみて下さい(元の直線の方程式に代入して式が成り立つかで分かります)。

(2)も同様の方法で出来ますのでやってみて下さい。

(1)
(x-3)/2 = (y+1)/-3 = (z-4)/A
の方向ベクトルは(2,-3,A)

(x+5)/3 = (y+6)/4 = (z+B)/1
の方向ベクトルは(3,4,1)
2つの方向ベクトルが直交するから内積=0
(2,-3,A)・(3,4,1)=6-12+A=0 ∴A=6

この時前半の直線は
(x-3)/2 = (y+1)/-3 = (z-4)/6(=kとおく)
媒介変数表現で
x=2k+3,y=-3k-1,z=6k+4…(1)

後半の直線は
(x+5)/3 = (y+6)/4 = (z+B)/1=h
とおけば媒介変数表現で
x=3h-5,y=4h-6,z=h-B…(2)

(1),(2)を連立方程式として解けば交点の座標(x,y,z)とBが求まります。
x=1,y=2,z=-2,B=4,k=-1,h=2
答えの...続きを読む

Q斜線A・BにLの距離P点に斜線に直角の線C・Dを描く方程式を教えてくだ

斜線A・BにLの距離P点に斜線に直角の線C・Dを描く方程式を教えてください。 点A(Ax,Ay),点B(Bx,By)を結ぶ線上に、点Aから距離Lの位置、点P(Px,Py)に斜線に直角の線を描く方程式を教えてください。

Ax=5000:Ay=4000
Bx=25000:By=22000

A点からP点まで距離 L=20000として
Px=19865.883:Py=17379.295

CD線の長さをL2=3000として
Cx=
Cy=
Dx=
Dy=
を求めたいのですが

Aベストアンサー

直線CDの方程式が知りたいのか、2点C、Dの座標が知りたいのか、どちらなのでしょうか?
わからないので両方書いておきます。

直線ABの傾きは、
(22000-4000)/(25000-5000)=9/10
従って、ABに直交する直線CDの傾きは、-10/9
よって、直線CDの方程式は、以下のように書けます。
y-Py=(-10/9)*(x-Px)

点Cと点Dの座標は、CP:PDを指定しないと求まりませんが……。
Cx=Px-(CPの長さ)* 9/√181
Cy=Py+(CPの長さ)*10/√181
Dx=Px+(PDの長さ)* 9/√181
Dy=Py-(PDの長さ)*10/√181

例えば、PがCDの中点の場合、以下のようになります。
Cx=Px-1500* 9/√181=18862.436
Cy=Py+1500*10/√181=18494.236
Dx=Px+1500* 9/√181=20869.330
Dy=Py-1500*10/√181=16264.354

QFortranで直交座標から極座標変換のプログラム

Fortranで直交座標から極座標変換のプログラム

FDTD法を用いて、散乱電場を求める際、最初Ex(i,j,k), Ey(i,j,k), Ez(i,j,k)を求めましたが、
それから座標をr方向に座標変換したく、プログラムを作ろうと思っているのですが、どのように書いてよいのか悩んでいます。
単位ベクトル r = (x,y,z)=(sinθcosφ,sinθsinφ,cosθ)と定義できるのですが、これを
どのように極座標のプログラムとして書いてよいのかわかりません。
どなたかわかる方がいらっしゃたら教えて下さい。よろしくお願いします。

Aベストアンサー

座標変換(デカルト座標から極座標)に伴う単位ベクトルの変換またはベクトル成分の変換を行おうということなら下記URL参照。

参考URL:http://www-d.ige.solan.chubu.ac.jp/goto/docs/math/pm6.ssi

Q斜線A・BにLの距離P点を求める方程式を教えてください。

斜線A・BにLの距離P点を求める方程式を教えてください。
点A(Ax,Ay),点B(Bx,By)を結ぶ線上に、点Aから距離Lの位置、点P(Px,Py)の座標を求める方程式を教えてください。

Aベストアンサー

線分ABの長さMは、
M=√{(Bx-Ax)^2+(By-Ay)^2}
点Pは線分ABをL:(M-L)に内分する点なので、
Px=Ax+(Bx-Ax)*L/M={(M-L)*Ax+L*Bx}/M
Py=Ay+(By-Ay)*L/M={(M-L)*Ay+L*By}/M

Q直線を描画するプログラム

初歩的ですみません。
マウスで始点と終点を決めて直線を書くプログラムを知っている方がおりましたら教えてください。

よろしくお願いします。

Aベストアンサー

WinTKというのは良く分からないんで、MFCの方を……
とりあえずダイアログアプリケーションで説明すると、

1.
 ダイアログベースのスケルトンを作ります
2.
 xxxDlg.h に座標を保持るためメンバを追加します。
class CxxxDlg : public CDialog
 {
   CPoint m_ptBegin, m_ptEnd;

3.
クラスウィザードで WM_LBUTTONUP, WM_RBUTTONUP を選択します。

4.
 void CxxxDlg::OnLButtonUp(UINT nFlags, CPoint point)
 {
   // ここの point に左ボタンが離された座標が入ってますので保持しておきます(始点)
   m_ptBegin = point;
   CDialog::OnLButtonUp(nFlags, point);
 }
5.
 void CxxxDlg::OnRButtonUp(UINT nFlags, CPoint point)
 {
   // ここの point に右ボタンが離された座標が入ってますので保持しておきます(終点)
   m_ptEnd = point;

   // 再描画します。
   InvalidateRect( NULL );

   CDialog::OnRButtonUp(nFlags, point);
 }

6.
 CxxxDlg::OnPaint()関数の以下の部分を変更します。

 else
 {
   CDialog::OnPaint();
 }
      ↓
 else
 {
   CPaintDC dc( this );

   dc.MoveTo( m_ptBegin );
   dc.LineTo( m_ptEnd );

   CDialog::OnPaint();
 }

と、大体こんな感じです。m_ptBegin, m_ptEndはコンストラクタで初期化してやっておいて
ください。説明が大雑把なんでわかりにくかったら言ってくださいね。

ほな。

WinTKというのは良く分からないんで、MFCの方を……
とりあえずダイアログアプリケーションで説明すると、

1.
 ダイアログベースのスケルトンを作ります
2.
 xxxDlg.h に座標を保持るためメンバを追加します。
class CxxxDlg : public CDialog
 {
   CPoint m_ptBegin, m_ptEnd;

3.
クラスウィザードで WM_LBUTTONUP, WM_RBUTTONUP を選択します。

4.
 void CxxxDlg::OnLButtonUp(UINT nFlags, CPoint point)
 {
   // ここの point に左ボタンが離された座標が入ってますので保...続きを読む

Q2線の交わる角度を求める式

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で除算が発生

2線の交わる角度
tanθ=(A-B)/(1+AB)

片方の線が垂直だと0で除算が発生しまい、うまく計算できません。
なにか他によい方法はないでしょうか。

Aベストアンサー

方向ベクトルの内積を考えて御覧なさい。

α = (ax1,ay1) - (ax2,ay2)
β = (bx1,by1) - (bx2,by2)
と置くと、2線の交わる角度 θ に関して、
α・β = |α||β|cosθ
が成立ちます。これで、cosθ の値が求まります。

cosθ の値から θ を求めるには、
よほど運が良くなければ、
関数電卓を使うことになるでしょう。

求まった θ は鈍角である可能性があります。
θ と π-θ のどちらが答えにふさわしいかは、
個々の例でよく考えて下さい。


人気Q&Aランキング