アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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

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

よろしくお願いします。

A 回答 (7件)

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



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


> 線分AB

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

この回答への補足

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

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

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

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


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

│   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

>線分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

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


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

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

#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

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

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

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