人生のプチ美学を教えてください!!

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

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

A 回答 (4件)

三点の座標は、それぞれ、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ψ|
    • good
    • 0

>任意の点Pと任意の点ABからなる線分の最短距離を算出したい .....



最短点が線分AB の端点なのか内点なのか、その判定がキーポイントみたいです。
A から B へ向かうベクトルを a 、A から P へ向かうベクトル p 、B から P へ向かうベクトル q を想定しましょう。
 q = p - a
内積 (a*p), (-a*q) = |a|^2 - (a*p) がともに非負なら最短点は線分AB の内点、それ以外なら端点だと思います。

内点のときの最短点の求め方や、最短距離算出はお判りでしょうから省略。
細かな検証まではしてませんので、ご吟味のほどを。
 
    • good
    • 0
この回答へのお礼

まず確認が遅れましたことをお詫びします。


皆様のおかげで処理を完成することができました!
ありがとうございました

お礼日時:2009/07/06 18:37

A・Bを通る直線の式、ax+by+c=0を求めます。


ただしa^2+b^2=1とします。
このとき最短距離は、aPx+bPy+cとなります。
    • good
    • 0

Pから線分ABにおろした垂線の足Hの位置で場合分けする必要があります。


もしHが線分AB上にあれば最短距離はPHとなります。
Hが線分AB上に無いときはPA,PBのうち小さいほうが求める最短距離になります。
どちらの場合でも計算は可能です。
    • good
    • 0

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