【先着1,000名様!】1,000円分をプレゼント!

いつもお世話になっています。
プログラミングで困っています。どなたか基本的な数学からご教授ください。

(1)線分ABに対して点Pから垂線を下ろすことが出来るかどうかの判定をするには?
(2)垂線と線分との交点の座標を求めるには?
(3)垂線と線分の交点の距離を求めるには

これらの処理を出来るだけ早く処理したいのです。
あと、確認なのですが
「線分に垂線を下ろすことができるのであれば、その交点が点に最も近い」
でいいのですよね。

よろしくお願いします。

A 回答 (7件)

N03,6です。


>結果(x,y)は
>x = ((p2-a2)(a2-b2)(a1-b1)-p1(a1-b1)^2+a1(a2-b2)^2)/((a1-b1)^2-(a2-b2)^2)
>y = ((p1-a1)(a1-b1)(a2-b2)-p2(a2-b2)^2+a2(a1-b1)^2)/((a2-b2)^2-(a1-b1)^2)

yを消去したあと符号が間違っていませんか。
答えは
x = ((p2-a2)(a2-b2)(a1-b1)+p1(a1-b1)^2-a1(a2-b2)^2)/((a1-b1)^2+(a2-b2)^2)
y = ((p1-a1)(a1-b1)(a2-b2)+p2(a2-b2)^2-a2(a1-b1)^2)/((a2-b2)^2+(a1-b1)^2)
となると思います。
    • good
    • 0

No3の訂正です。


>垂線の方程式は
(y-p2)(a2-b2)+(x-p1)(a1-b1) =0
>ABをとおる直線の方程式は
(y-a2)(a1-b1)-(x-a1)(a2-b2) =0

=0がぬけていました。

連立方程式を解くコツというほどでは、ありませんが
垂線の方程式を(a1-b1)倍して
ABの方程式を(a2-b2)倍して
yの係数を合わせてyを消してxを求める方法が途中で分数形式にならないので計算しやすいのではないでしょうか。

また、xが求まればyはxを垂線の方程式等に代入するのではなく、求めたxの式の中のa1,a2等の1と2を全て入れ替えればyが求まります。
    • good
    • 0
この回答へのお礼

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

連立方程式の解き方はこのような感じでよろしいでしょうか?
(y-p2)(a2-b2)+(x-p1)(a1-b1) =0
(y-a2)(a1-b1)-(x-a1)(a2-b2) =0

(y-p2)(a2-b2)(a1-b1)+(x-p1)(a1-b1)(a1-b1) =0
(y-a2)(a1-b1)(a2-b2)-(x-a1)(a2-b2)(a2-b2) =0

y(a2-b2)(a1-b1)-p2(a2-b2)(a1-b1)+(x-p1)(a1-b1)(a1-b1) =0
y(a2-b2)(a1-b1)-a2(a1-b1)(a2-b2)-(x-a1)(a2-b2)(a2-b2) =0

p2(a2-b2)(a1-b1)+(x-p1)(a1-b1)(a1-b1) = a2(a1-b1)(a2-b2)-(x-a1)(a2-b2)(a2-b2)

(p2-a2)(a2-b2)(a1-b1) = (x-p1)(a1-b1)^2 -(x-a1)(a2-b2)^2

(p2-a2)(a2-b2)(a1-b1) = x(a1-b1)^2-x(a2-b2)^2-p1(a1-b1)^2+a1(a2-b2)^2

(p2-a2)(a2-b2)(a1-b1) = x((a1-b1)^2-(a2-b2)^2)-p1(a1-b1)^2+a1(a2-b2)^2

x((a1-b1)^2-(a2-b2)^2) = (p2-a2)(a2-b2)(a1-b1)-p1(a1-b1)^2+a1(a2-b2)^2

結果(x,y)は
x = ((p2-a2)(a2-b2)(a1-b1)-p1(a1-b1)^2+a1(a2-b2)^2)/((a1-b1)^2-(a2-b2)^2)
y = ((p1-a1)(a1-b1)(a2-b2)-p2(a2-b2)^2+a2(a1-b1)^2)/((a2-b2)^2-(a1-b1)^2)

結果が合わないような気がするのですが。。

お礼日時:2003/11/28 10:58

#4 の訂正です。



誤) (1) は (p - a)・(b - a) > 0 かつ (p - a)・(a - b) > 0 なら,H は線分 AB 上にある,

正) (1) は (p - a)・(b - a) > 0 かつ (p - b)・(a - b) > 0 なら,H は線分 AB 上にある,
    • good
    • 0

ベクトルを使って考えてみます。


図を書きながら読んで下さい。

A, B,P の位置ベクトルをそれぞれ a, b, p とします。
P から直線 AB に下した垂線の足を H とし,その位置ベクトルを h とします。

A から B に向かう単位ベクトルを c とすると,
 c = (b - a)/|b - a|
です。

H は直線 AB 上にあるので,
 h = a + t c
で表されます。t はスカラーの定数です。

垂線 PH と直線 AB は直交するので,
 (h - p)・c = 0 (・は内積を表しています)
です。これから,
 (a + t c - p)・c = 0
 t = (p - a)・c
というふうに t が求まります。

(1) 0 ≦ t ≦ |b - a| ならば,H は線分 AB 上にあります。
(2) h = a + t c から H の座標が求まります。
(3) |p - h| から垂線の長さが求まります。

以上を素直にプログラムしても出来ますが,速度的には「?」です。

手計算でベクトルを使わない表現に直してしまったほうがいい-かも-しれません。
# そうすると結局,垂線の方程式と直線の方程式から連立に解いた場合と同じ結果になりますが。

# (1) は (p - a)・(b - a) > 0 かつ (p - a)・(a - b) > 0 なら,H は線分 AB 上にある,
# としてもいいです。(成分で計算すると,yuusukekyouju さんのと同じになると思います)
    • good
    • 0

>線分ABに対して点Pから垂線を下ろすことが出来るかどうかの判定をするには?



A(a1,a2) B(b1,b2) P(p1,p2)とおいたとき

[(a2-p2)(a2-b2)+(a1-p1)(a1-b1)][(b2-p2)(a2-b2)+(b1-p1)(a1-b1)]≦0
の時垂線を引けます。0の時は垂線がAまたはBにきます。

>垂線と線分との交点の座標を求めるには?

垂線の方程式は
(y-p2)(a2-b2)+(x-p1)(a1-b1)
ABをとおる直線の方程式は
(y-a2)(a1-b1)-(x-a1)(a2-b2)

これを連立して解いてください。

>垂線と線分の交点の距離を求めるには

上記よりxy座標がもとまるのでもとめてください。

>「線分に垂線を下ろすことができるのであれば、その交点が点に最も近い」

はい、そのとおりです。
    • good
    • 0
この回答へのお礼

分りやすい回答ありがとうございます。

>これを連立して解いてください。

プログラムにするとすごく長くなるのですが、この連立方程式を解くのに何かこつみたいなのがありますか?

お礼日時:2003/11/27 21:47

式やズバリの回答を書くのもアレなので、考え方のヒントです。


(あくまでも私だったら…という方法です。他のもっと処理が早い方法もあると思います。)

│   P

│    B
│ A

┼────────

ABPを平行移動して、Aを原点に持ってくる。


│  P'

│   B'
│A'
┼────────

A'B'とx軸のなす角θだけ回転する。
B'がx軸の上に来てB''になる。



│   P''
│   
│A'   B''
┼────────

Pのx座標が[0~Bのx座標]ならば、交点を持つ。(1)
距離はP''のy座標の絶対値。(3)

この図での交点の座標はQ(P''のx, 0)なので、元の図での交点を求めるために、Qを逆回転、逆平行移動を行う。(2)

--
ポイントは回転角の求め方と回転の変換かな?
データの型を上手く定義すると綺麗に書けるかも。
    • good
    • 0
この回答へのお礼

大体はイメージできるのですが、私の頭では数式にあらわすこともできず。。ましてやプログラムにすることも出来ないようです。。(ーー;)

回答ありがとうございました。

お礼日時:2003/11/27 21:45

以下の点を補足してみてください。



2次元平面で考えるか、3次元空間で考えるか?
(ヒントを書き込む際のモチベーションにかなり影響します。)


> 線分AB

A点B点の座標が分かっている線分という事?

この回答への補足

あっごめんなさい。平面です

線分ABそれぞれの座標や点Pの座標は分っています。

補足日時:2003/11/26 18:28
    • good
    • 0

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

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

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

Q任意の点と任意の線分との最短距離となる点

現在C++でシューテイングゲームを作成しています。
当たり判定の計算として二次元座標の三点で判定を取れないかと考えて詰まっています。

具体的には任意の点Pと任意の点ABからなる線分の最短距離を算出したいのですが、これは可能なのでしょうか

Aベストアンサー

三点の座標は、それぞれ、A(a1,a2)、B(b1,b2)、P(p1,p2) であるとします。
次の三つの操作で最短距離が求まります。

(1)点Aが原点にくるよう全体を平行移動させます。
   A(0,0)、B(b1-a1,b2-a2)、P(p1-a1,p2-a2) となる.

(2)線分ABがx軸と合うよう全体を回転させます。
   θ=arctan{(b2-a2)/(b1-a1)} として、
   A(0,0)、B{(b1-a1)/cosθ,0}、P{(p1-a1)/cosθ,(p2-a2)/sinθ} となる.

(3)・ |点Pのx座標|≦|点Bのx座標| の場合、最短距離は、|点Pのy座標|
   つまり、|(p2-a2)/sinθ|
  ・ |点Pのx座標|>|点Bのx座標| の場合、
   ψ=arctan[{(p2-a2)/sinθ}/[{(p1-a1)/cosθ}-{(b1-a1)/cosθ}] として、
   最短距離は、|{(p2-a2)/sinθ}/sinψ|


人気Q&Aランキング