• ベストアンサー

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

現在C++でシューテイングゲームを作成しています。 当たり判定の計算として二次元座標の三点で判定を取れないかと考えて詰まっています。 具体的には任意の点Pと任意の点ABからなる線分の最短距離を算出したいのですが、これは可能なのでしょうか

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

  • ベストアンサー
noname#95312
noname#95312
回答No.2

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

その他の回答 (3)

noname#101087
noname#101087
回答No.4

>任意の点Pと任意の点ABからなる線分の最短距離を算出したい ..... 最短点が線分AB の端点なのか内点なのか、その判定がキーポイントみたいです。 A から B へ向かうベクトルを a 、A から P へ向かうベクトル p 、B から P へ向かうベクトル q を想定しましょう。  q = p - a 内積 (a*p), (-a*q) = |a|^2 - (a*p) がともに非負なら最短点は線分AB の内点、それ以外なら端点だと思います。 内点のときの最短点の求め方や、最短距離算出はお判りでしょうから省略。 細かな検証まではしてませんので、ご吟味のほどを。  

amos_0000
質問者

お礼

まず確認が遅れましたことをお詫びします。 皆様のおかげで処理を完成することができました! ありがとうございました

  • Ishiwara
  • ベストアンサー率24% (462/1914)
回答No.3

A・Bを通る直線の式、ax+by+c=0を求めます。 ただしa^2+b^2=1とします。 このとき最短距離は、aPx+bPy+cとなります。

  • rnakamra
  • ベストアンサー率59% (761/1282)
回答No.1

Pから線分ABにおろした垂線の足Hの位置で場合分けする必要があります。 もしHが線分AB上にあれば最短距離はPHとなります。 Hが線分AB上に無いときはPA,PBのうち小さいほうが求める最短距離になります。 どちらの場合でも計算は可能です。