• ベストアンサー

「最短距離」の接触判定

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です。

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

  • ベストアンサー
  • mcq
  • ベストアンサー率48% (45/93)
回答No.1

前もって、暫定最短点及び暫定最短距離を保存する変数をそれぞれ用意しておき、 【接触判定】のfor文の中で、求めた距離が暫定最短距離よりも短ければ暫定最短点及び暫定最短距離を更新 とすれば良いのでは無いでしょうか?

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

pointの座標を検索するより、実際に描画されている点でマウスから50*50の範囲で最小となる座標を探す方がいいかも内側から探していけばいいし。

  • shkwta
  • ベストアンサー率52% (966/1825)
回答No.2

ピタゴラスの定理を使えばよいのでは? つまり、サンプリングした座標点をX1, Y1とし、右ドラッグしているマウスポインタの座標点をX2, Y2とします。 D = (X1 - X2)の2乗 + (Y1 - Y2) の2乗 を計算して、Dのもっとも小さくなる点を選べばよいとおもいます。(Dは距離の2乗に相当します)

関連するQ&A