• ベストアンサー

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

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

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

  • ベストアンサー
回答No.4

>確認ですが、求めた最近点が求める点であることを保障するには、 >その最近点とQの距離が矩形の横幅、縦幅以上の場合には、再度 >矩形を取り直す必要がありますよね。必要ないのかしら? この場合は、アプリケーションの仕様によると思います。 マウスカーソル等の最近傍をとりたい場合などには、 最長近傍距離LMaxを指定してそれより近い点が無い場合 は「対象点無し」という結果にするのが一般的です。 この場合、矩形の幅と高さはLMax×2にすれば十分です。 どうしてもLMaxを超える点をとりたい場合は、順次矩形 を拡大してやりなおします。

usatan2
質問者

お礼

再度回答ありがとうございます。 私の望むアプリケーションでは、「対象点無し」はなく、少なくとも1点P1は定義されているという条件なので、必ず、最近点を返す必要があります。 点Qが原点(0,0)、P1(2,2),P2(3,0)があった場合、最近点はP2ですが、矩形の横幅、縦幅を2で検索する(LMax=2)とP1しか見つかりませんよね。P2を見つけるには、見つかったP1までの距離2√2を矩形の横幅、縦幅にして(LMax =距離QP1) 再度矩形を取りなおす必要があると思い、確認させてもらいました。逆に、P1迄の距離がはじめの矩形の2以下であれば、再確認の必要がないと考えました。これで合ってますよね?

その他の回答 (3)

  • Interest
  • ベストアンサー率31% (207/659)
回答No.3

最短経路計画のアルゴリズムは、調べればたくさん出てくると思いますよ。 グラフ理論を少しかじるといろいろ出てきます。代表的なところでは、 - 深さ優先探索(バックトラック法):超有名どころ - ダイクストラ法:経路計画の定番 - A*(えーすたー)アルゴリズム:ダイクストラ法の拡張版 などがあります。これらはすべて数学的に最短経路であることを保証できるアルゴリズムです。あとはググればアルゴリズムそのものが出てると思いますので、ご自身で検索してみてください。

usatan2
質問者

お礼

回答ありがとうございます。 最短距離の点Pi(1点)を求めたいだけですが、これも最短経路計画のアルゴリズムが使えるのでしょうか? お恥ずかしい話、どうやって使ってよいのかわかりません。 ダイクストラ法を使うとして、使い方が思いつきません。よろしかったら、もう少し具体的に、教えてくださるとうれしいです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

アルゴリズムの立場から言えば, P1~Pn があらかじめ固定されているならそれらのボロノイ図を作っておくのが普通. オーダーは忘れた. ボロノイ図を作るのに O(n log n), 点Q が与えられたときの探索に O(log n) くらいだっけ.

usatan2
質問者

お礼

回答ありがとうございます。 ボロノイ図って言うのですね、勉強不足ではじめて聞きました。 欲しい関数は、ボロノイ図をつくり、領域に番号を振り、点Qを与えると点Qの属する領域番号を返す関数ということになります。 お陰様で、概念としては整理されましたが、具体的なプログラミングをどうしたらよいのか、やはり判りません。つまり、 ・どうやってボロノイ図を作成するのか、 ・ボロノイ図はどのような形で記憶させるのか ・関数はそのボロノイ図をどうやって扱って点Qの属する領域番号を得るのか が判らないとプログラミングできません。何かヒントや、参考図書ありましたらご紹介お願いいたします。 もちろん、ボロノイ図で検索しましたが・・・

回答No.1

Qの近傍以外を最初から排除するのが適当だと思います。 距離計算は高コストですが、Qを中点とする矩形内に Piが含まれるかどうかの算定は低コストですみます。 矩形内に見つかった点に対して距離計算し、最近点を 算定します。 別の方法として、Pi群を座標でソートしておくのも 頭のよいやり方です。Q点が移動した場合、直前の 最近点Pnの近くにあるPiをこのソート結果を参考にし て推定します。 ただし、Qの位置が跳躍するとあまり意味がありません。

usatan2
質問者

お礼

回答ありがとうございます。 なるほど、矩形を決めて、その中に入るPiだけ距離計算してその中から最近点を求めるのですね。 確認ですが、求めた最近点が求める点であることを保障するには、その最近点とQの距離が矩形の横幅、縦幅以上の場合には、再度矩形を取り直す必要がありますよね。必要ないのかしら? また、ソートする方法も使えそうです。 直面する事例では2次元ですが、将来は3次元以上も考えているのですが、教示いただいた手法は3次元以上でも使えそうで助かります。 ありがとうございます。

関連するQ&A

  • 最短距離の量は保存されるか

    xy平面に直線と円があり、その最短距離は、直線上の点p、円上の点qのときとする。直線と円をそれぞれx軸方向にa倍、y軸方向にb倍した図形の最短距離は、点p、点qをそれぞれx軸方向にa倍、y軸方向にb倍した点の距離になるかどうか。  図形の性質から、そうなる、そうならない、とわかりやすい説明が付かないか考えています。よろしくお願いします。

  • 平面と点の最短距離

    ある平面と点の最短距離を計算するプログラムを作成したいのですが、計算方法がわかりません。 平面はXYZを持った4点で定義されており大体長方形になっています。 最短距離は、この長方形の範囲内にぶつけるような形で求める必要があります。 数学の知識に乏しい為、なるべく簡単な方法を教えて頂けると助かります。 宜しくお願い致します。

  • 2直線のベクトルの最短距離 (空間)

    今、ベクトルl=t(1,2,3)+(-2,1,2) ベクトルm=s(3,-1,2)+(1,2,-3) s,tは実数。lとmの最短距離を求めよ。 ここで解法では 直線mを含む平面Aを求め、 その後、平面Aと(-2,1,2)との距離を求め、これを最短距離としているのですが、なぜ、最短距離になるのでしょうか? l上の任意の点とm上の任意の点の距離を調べるのが自然だと思うのですが。また、m上の平面の式を求めるのは違和感もあります。

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

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

  • 空間座標 球面上の点と空間にある点の距離について

    空間座標において 「『球面上の点と空間にある点P』との(最短)距離」は球面中心と点Pを結んだ距離と球面の半径と差で求めると思うのですが、感覚的にはわかる気がしますし、平面座標だと分かりますが、空間座標になると本当にそうなのかと思ってしまいます。式で証明することができるのでしょうか。 また、「『球面上の点と直線の点』との距離」や「『球面上の点と平面の点』との距離」も同じように球面の半径から直線の点もしくは平面の点に垂線を下ろして考えるのでしょうか。

  • 心射平面図法の2点間の距離について

    心射平面図法上の任意の2点間を結ぶ直線は、2点間の最短コースとなることの説明 どうか教えて頂きたいです。お願いします。

  • 点と折れ線との間の距離を求める

     点と折れ線との間の最短距離を求めたいのですが、そういうライブラリ(できればソースの読めるもの)やアルゴリズムなど何処かにないでしょうか?

  • 最短距離

    AB=BC=CD=DA=WX=XY=YZ=ZW=12cm AW=BX=CY=DZ=30cm の直方体ABCD-WXYZにおいて、 ABの中点E、YZの中点Vを取り、 AE=EB=YV=VZ=6cm 点Eから辺DCへ1cm垂線の足を下ろした点P 同様に点Vから辺WXへ1cm垂線の足を下ろした点Q EP=VQ=1cm があります。 この立方体の表面を通る点Pと点Qの最短距離を求めなさい。 友達が出してきた問題なのですが、どうすればいいのか分かりません。ちなみに42cmではないそうです。 ヒントだけでもいいのでよろしくお願いします

  • 複数の点を最短距離で全て繋ぐアルゴリズム

    C++で以下のようなプログラムを書こうと思うのですが、 効率的なアルゴリズムが思い浮かびません。 よい方法をご存知の方がおりましたら教えてください。 ------------------------ xy平面上に複数の点があります。 それぞれの点の座標は全て分かっています。 今、原点から出発して全ての点を直線で結んでいくのですが このとき引く直線の長さの総計が最小になるような 結び方を見つけたいのです。 全ての結び方をしらみつぶしに調べると (点の数)! 通りの総直線距離を計算しなければならず 点が増えるとかなり苦しいことになります・・・

  • 円の最短距離。。。

    円C:x2乗+y2乗ー16x-18y+96=0上の点と、直線J;4x+3y=5との最短距離を求めよ。。 最短距離というのはなんですか?自分の教科書簡単な方なので載ってません。 二次関数f(x)=x2乗+axのー2≦x≦2における最大値M(a)を求よ。 これは平方完成したら解けると思いしたんですがそれから先がピンときません。

専門家に質問してみよう