• ベストアンサー

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

現在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のうち小さいほうが求める最短距離になります。 どちらの場合でも計算は可能です。

関連するQ&A

  • ★点と線分の距離??★

    いつもお世話になっています。 プログラミングで困っています。どなたか基本的な数学からご教授ください。 (1)線分ABに対して点Pから垂線を下ろすことが出来るかどうかの判定をするには? (2)垂線と線分との交点の座標を求めるには? (3)垂線と線分の交点の距離を求めるには これらの処理を出来るだけ早く処理したいのです。 あと、確認なのですが 「線分に垂線を下ろすことができるのであれば、その交点が点に最も近い」 でいいのですよね。 よろしくお願いします。

  • 2つの線分の最短距離

    2つの線分の衝突判定をして、そこから色々な形の当たり判定を作っていこうと思っているのですが・・・ 3次元上で、タイトルのものをどう計算して出したらいいのか分かりません。 本もいくつか読んでみましたが、数式しか載っていなくて、プログラムでどう表現したらいいのか・・・ ご教授願います。

  • 2線分の最短距離。

    X、Y座標系で2線分の最短距離を測りたいのですが、お互いの端点から相手線分へ下ろした垂線の長さが最小となるものでよいのでしょうか?

  • 2線分の最短距離

    2線分の最短距離を求める方法はありませんか? ぐぐっても見ましたが点と線ばかりでした。

  • 3次元の直線と座標が最短距離となる直線の座標とは?

    先日、質問では2次元の直線と座標が最短距離となる直線の座標を質問させていただきました。 今度は (1)3次元での直線※と任意の(2)座標(x1、y1、z1)があります。 (1)直線と(2)座標が最短距離となる直線上の座標を計算方法を教えて頂ければ幸いです。 ※(x、y、z)=(0,0,0)~(1,1,1)の対角線

  • 2つの線分に垂直な線分の交点

    2次元平面に点P(x0,y0)、点A(x1,y1)、点B(x2,y2)があり、 点Aを通る線分PAに垂直な線分と 点Bを通る線分PBに垂直な線分の交点の 求め方を教えて下さい。 垂直ベクトルを求め、任意に座標を決めて 連立方程式を解くやり方だと上手くいかない時が あります。シンプルに求める方法がありましたら 教えて下さい。

  • 点Qから最短距離の点Piを効率的に求めたい

    平面上にP1,P2,...,Pnが与えられています。 このとき、任意の点Qを与えると、Qからの距離の最短の点(等距離の点が複数あれば、そのうちの任意の1点)を返す関数(任意といった時点で数学的には関数でなくなっていますが)が欲しいのです。 単純に考えれば、forループで、全てのPiとの距離を求め、最短のPiを返せば良いのですが、点Qが移動する場合、直前のQに対応するPiである可能性が高いので、もう少し賢いアルゴリズムがある気がします。しかし、具体的なアルゴリズムが思いつきませんので、お知恵をお貸しください。 プログラミングはCを想定しています。

  • 楕円内の任意の点から楕円周までの最短距離

    長半径がaで、短半径がbである楕円内に、ランダムに点(座標X0,Y0)をプロットし、その点から楕円周までの最短距離をperlを使って計算したいと思っています。 最終的には、最短距離の分布がどのようになっているのかを求めたいと思っています。   この計算の結果は、細胞の形を楕円に近似したときに、特定の組織の位置がランダムな場所にあるのか、細胞の表面近くに存在する傾向があるのかを調べるためのコントロールデータとして使う予定でいます。   しかし、座標X0,Y0から、楕円周までの最短距離をどのようにして計算したらよいのか見当もつきません。計算過程は省いていただいても構いませんので、最終的にどのような式を使えば計算できるのか、教えていただけないでしょうか。 よろしくお願いします。

  • 「最短距離」の接触判定

    1.マウスポインタの左ドラッグ中には、通った軌跡をサンプリングし、Flagを1にして座標(x,y)を「Point」という変数に記録(x[Point],y[Point],Flag[Point]=1)していくとともに、隣り合う座標点を結んで線を描く。 2.マウスポインタの右ドラッグ中に、指定した範囲周辺(例えば50*50[mm]以内)にサンプリングされた座標点が入ったら「接触」と判定する。 3.この際、複数の座標が範囲内に含まれている場合は、マウスポインタの中心から最短距離にある座標点を「接触点」とする。 4.接触点に対してアクションを起こす(例えば、移動させる、線の色や太さを変える、など)。 このようなプログラムにおいて、「最短距離にある座標点」の検出をどのように記述すればいいでしょうか。 接触判定、最短距離の接触点の検出、描線の開始・終了点の検出、アクション、という順番に記述しようと思うのですが、 【接触判定】 マウスポインタの位置と各Pointとの距離の絶対値をfor文で調べ、指定範囲内に収まっているものがあれば接触と判定。 【最短距離の接触点の検出】 ? 【描線の開始・終了点の検出】 最短距離の接触点から描画開始・終了方向にそれぞれシーケンシャルサーチして、Flagが1から0になるところの点をそれぞれ開始点・終了点とする。 【アクション】 開始点~終了点までの各Pointにアクションを起こす。 このような流れです。具体的にどのように最短距離の検出を書けばいいか、ご指導いただけませんでしょうか。使用ソフトはC++Builder4です。

  • ある点からある直線へ降ろした垂線の交点

    3次元空間において、3点A,B,Pがあったとします。 A,B,Pの座標はそれぞれ既知で、A(xa,ya,za) B(xb,yb,zb) P(xp,yp,zp)と表わされる時に、 (1)線分ABに対して点Pから垂線を下ろすことが出来るかどうかの判定をするには? (2)垂線と線分との交点の座標を求めるには? 以上の2つのことを行いたいのです。 数学的知識に乏しいため、自力ではなかなか答えに辿り着くことが出来ません。 よろしくお願いします。