- ベストアンサー
任意の点と任意の線分との最短距離となる点
現在C++でシューテイングゲームを作成しています。 当たり判定の計算として二次元座標の三点で判定を取れないかと考えて詰まっています。 具体的には任意の点Pと任意の点ABからなる線分の最短距離を算出したいのですが、これは可能なのでしょうか
- みんなの回答 (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ψ|
その他の回答 (3)
>任意の点Pと任意の点ABからなる線分の最短距離を算出したい ..... 最短点が線分AB の端点なのか内点なのか、その判定がキーポイントみたいです。 A から B へ向かうベクトルを a 、A から P へ向かうベクトル p 、B から P へ向かうベクトル q を想定しましょう。 q = p - a 内積 (a*p), (-a*q) = |a|^2 - (a*p) がともに非負なら最短点は線分AB の内点、それ以外なら端点だと思います。 内点のときの最短点の求め方や、最短距離算出はお判りでしょうから省略。 細かな検証まではしてませんので、ご吟味のほどを。
- Ishiwara
- ベストアンサー率24% (462/1914)
A・Bを通る直線の式、ax+by+c=0を求めます。 ただしa^2+b^2=1とします。 このとき最短距離は、aPx+bPy+cとなります。
- rnakamra
- ベストアンサー率59% (761/1282)
Pから線分ABにおろした垂線の足Hの位置で場合分けする必要があります。 もしHが線分AB上にあれば最短距離はPHとなります。 Hが線分AB上に無いときはPA,PBのうち小さいほうが求める最短距離になります。 どちらの場合でも計算は可能です。
お礼
まず確認が遅れましたことをお詫びします。 皆様のおかげで処理を完成することができました! ありがとうございました