• 締切済み

平面と点の最短距離

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

みんなの回答

  • inara1
  • ベストアンサー率78% (652/834)
回答No.4

>4点から求める平面は、無限に広がる平面ではなく、4点から成る壁というイメージです その壁というのは、4点を頂点とする概略長方形になっているのでしょうか(壁は1枚?)。もしその平面がその4点の内側に限定されているとき、ある点からその平面に下ろした垂線の足が平面上に来ないこともありますが・・その場合の距離はどう定義するのでしょうか(無限の平面なら垂線の足は必ず存在するので距離は決まりますが)。 なんだか分からなくなってきました。もう少し具体的に説明してもらえないでしょうか。

  • inara1
  • ベストアンサー率78% (652/834)
回答No.3

ANo.2です。 ご質問の4点とは、位置の測定値で、その4点から平面を決め、第5の点とその平面との距離を出したいということでしょうか。それでしたら少々お待ちください。

nu1976
質問者

補足

ご回答いただきありがとうございます。 >ご質問の4点とは、位置の測定値で、その4点から平面を決め、第5の点とその平面との距離を出したいということでしょうか 4点から求める平面は、無限に広がる平面ではなく、4点から成る壁というイメージです。 その壁と任意の点との最短距離を求めようとしています。

  • inara1
  • ベストアンサー率78% (652/834)
回答No.2

趣味でグラフィックスをやっているものと思います(こんな問題は出るはずがないので)。 式の導出は必要ないと思いますので結果だけ書きます。 平面を決める3点の座標が    ( x1, y1, z1 )、( x2, y2, z2 )、( x3, y3, z3 ) のとき、この平面と点( x0, y0 , z0 ) との最短距離 L は以下のようになります。 (1) ( y2- y3 )*x1 + ( y3 - y1 )*x2 + ( y1 - y2 )*x3 ≠ 0 の場合      L^2 = ( x - x0 )^2 + ( y - y0 )^2 + ( z - z0 )^2      x = ( ( b^2 + c^2 )*x0 - a*b*y0 + a*c*z0 )/( a^2 + b^2 + c^2 )      y = ( - a*b*x0 - ( a^2 + c^2 )*y0 - b*c*z0 )/( a^2 + b^2 + c^2 )      z = - ( a*x + b*y )/c      a = -( ( z2 - z3 )*y1 + ( z3 - z1 )*y2 + ( z1 - z2 )*y3 )/d      b = ( ( x2 - x3 )*z1 + ( x3 - x1 )*z2 + ( x1 - x2 )*z3 )/d      c = ( ( y2- y3 )*x1 + ( y3 - y1 )*x2 + ( y1 - y2 )*x3 )/d      d = ( y2*z3 - y3*z2 )*x1 + ( y3*z1 - y1*z3 )*x2 + ( y1*z2 - y2*z1 )*x3 (2) ( y2- y3 )*x1 + ( y3 - y1 )*x2 + ( y1 - y2 )*x3 = 0 の場合      L^2 = ( a*x0 + b*y0 - 1 )^2/( a^2 + b^2 )      a = -( ( z2 - z3 )*y1 + ( z3 - z1 )*y2 + ( z1 - z2 )*y3 )/d      b = ( ( x2 - x3 )*z1 + ( x3 - x1 )*z2 + ( x1 - x2 )*z3 )/d      d = ( y2*z3 - y3*z2 )*x1 + ( y3*z1 - y1*z3 )*x2 + ( y1*z2 - y2*z1 )*x3 (1)の x, y, z は点( x0, y0 , z0 ) から平面に下ろした垂線の足の座標になります。 (2)は平面がz軸に平行な場合に相当するので、直線 a*x + b*y = 1 と点( x0, y0 ) との距離になります。このときの平面に下ろした垂線の足の座標は      x = ( b*( b*x0 - a*y0 ) + a )/( a^2 + b^2 )      y = ( -a*( b*x0 - a*y0 ) + b )/( a^2 + b^2 )      z = z0 になります。a^2 + b^2 = 0 となるのは、平面を決める3点のうち2点が同じ点にある場合ですので、平面が決まらず、距離も決まりません。 上の結果は数式処理ソフトで計算したものです。式をコピー・ペーストできるように、カッコは全部半角の ( ) にしてあります(式の先頭は全角スペースなので注意)。 なお、質問文に「平面はXYZを持った4点で定義されており」とありますが、この4点が同一平面上にあるためには、4点全ての座標が a*x + b*y + c*z = 1 を満足していなければなりません。3点の座標から a, b, c が決まりますので、残る4点目の座標が a*x + b*y + c*z = 1 を満足していれば、4点は同一平面上にあります。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>数学の知識に乏しい為、なるべく簡単な方法を教えて頂けると助かります。 そんなん言われたら誰も回答できんがな。 一体、どうやって回答の妥当性を確認するつもりだったんですか? あなたの数学的知識の度合いがわかる何かを補足にどうぞ。

nu1976
質問者

補足

失礼いたしました。 >一体、どうやって回答の妥当性を確認するつもりだったんですか? 計算結果を基に、CADソフトで実際の図形を描いて確かめてみるつもりでした。 >あなたの数学的知識の度合いがわかる何かを補足にどうぞ。 高校数学レベルから勉強をやり直しているところでした。 参考書を一通り読み終わり、実際に問題を解きながら復習しているようなレベルです。

関連するQ&A

  • 点と平面の距離の算出

    仕事の関係で急に空間図形の処理をしなければ いけなくなりました。 点(xf,yf,zf)が乗っている平面F(ax+by+cz+d=0)があり、 点M(xm,ym,zm)の方向余弦が(l,m,n)だった場合、 平面Fと点Mの距離を求めるためにはどうしたら いいのでしょうか? 単純に点Mと平面Fとの最短距離を求めるだけなら 垂線をひっぱって内積の関係を使ったりすれば できるかもしれませんが、方向余弦がからんでくると もうよくわかりません… 簡単な問題なのかもしれませんが、 数学から離れてずいぶんたちますので どなたかお力を貸してくださると助かります。 よろしくお願いします。

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

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

  • 平面と点の距離

    空間上に点o(0,0,0),A(4,2,0),B(1,2,1),C(0,3,6)の4点がありOABが作る平面Cとの距離を求めなさい。 僕は外積を使って出すのもいいと思うのですが、 高校の範囲内での解き方(外せきを使わずに) 解けないものでしょうか。 答えは6√14/7になります

  • 点と仮想平面の距離(例題)

    以前、3D(X、Y、Z)で3点の点が存在する時に、 3点の座標を含む仮想平面の求め方と、別の点(4点目)と仮想平面との距離を教えてもらいました。 自分なりにエクセルで計算式を組んだのですが、それがあっているのかどうかわかりません。 どなたか良い問題を教えてください。 計算途中の式はなくてもかまいません。

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

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

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

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

  • 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上の平面の式を求めるのは違和感もあります。

  • 平面に反射する点を求めたいのですが…。

    はじめまして。 当方大学生です。立体的なものの考え方が苦手で、考えていたら余計こんがらがってきてしまいました。 既知の平面H:ax + by + cz + d = 0 があります。 この平面を突き抜ける形で、点がP = (p1,p2,p3) からQ = (q1,q2,q3)へ移動していきます。P、Qの値も既知です。 (※)この平面が点の動く範囲を制限する制約条件(境界面)となっていて、点が動いた時に境界面を越えたら反射するプログラムを組み込みたいのですが…。 このとき、平面を突き抜ける事なく、点を平面Hに対して反射させた新たな点R = (r1,r2,r3)を求めたいです。 わかる方、教えていただけたら嬉しいです。 よろしくお願いします。

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

    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次元での点群に対する最小二乗法での平面の算出について(点と平面の距離。残差ではない。) -- 点と平面のZ軸方向の距離(残差)の二乗和を最小とする場合には、 平面をax+by+c=zとして、Σ(ax+by+c-z)^2をa,b,cのそれぞれで偏微分して それを=0とした連立方程式を解くことで解を得ることが出来ました。 また、式の形も、ある点のxとyを平面の式へ代入した際の値と、点のz値の差分を見ており、 簡単に納得のできるものとなりました。 これに対して、点と平面の距離(空間的な最小距離)の二乗和を最小とする場合には、 どのような流れで計算すれば良いのでしょうか? 点と平面の距離は|Ax+By+Cz+D| (A,B,Cは単位ベクトル)として求まりますが、 これをどう使うのかが分かりません。 Σ(Ax+By+Cz+D)^2をA,B,C,Dのそれぞれで偏微分して=0としても、 定数項が無いため、連立方程式の解がすべてゼロとなってしまいます。 強引に、Σ(A'x+B'y+C'z+1)^2として変形させて解いてみましたが、 得られたA',B',C'からA,B,C,Dに戻すと、Dがきちんと出ませんでした。(他についても怪しい。) こういった状況に迷い込んでしまい、どう考えるのが良いのか分からなくなってしまいました。 指南いただけませんでしょうか?