Wiki内検索
最近更新したページ
2011-08-24
2010-05-18
2010-05-03
2010-02-18
2010-02-10
2010-02-09
2010-02-08
2010-02-07
2010-02-02
2009-12-24
2009-12-05
2009-07-05
2009-07-03
最新コメント
MenuBar1 by stunning seo guys
MenuBar1 by stunning seo guys
MenuBar1 by stunning seo guys
MenuBar1 by awesome things!
MenuBar1 by awesome things!
MenuBar1 by awesome things!
MenuBar1 by check it out
MenuBar1 by awesome things!
MenuBar1 by check it out
MenuBar1 by stunning seo guys
Menu
Programming Tips
タグ

distancePlaneToPoint

無限平面と点の距離


3D空間上のある無限平面とある点Qの距離を出すには、

距離 = 内積( 平面の法線、Q点座標 ) − 平面方程式のd;

(注:平面の法線は正規化されてる必要がある)


どうしてこのようになるかと言うと

まず、点Qの平面上の最接近点Rがあると考えます。
また平面上のどこかに点Pがあり、法線Nとdはわかっているとします。

このRは

点Qから、法線Nと面からQまでの距離tを掛けたベクトルを引くことによって得られます。
(方向としてのNベクトルに距離を掛ければ最接近点RからQまでの距離になるのです)
(あと、まだこの時点でtもRもPもわかっていませんが、式として表せます)

R = Q ー N * t;

このRをax+by+cz-d=0の平面方程式に当てはめると
(Rをxyz,法線Nをabcとする。ax+by+czはabcとxyzの内積であるので)

R・N - d = 0;

Rに最初の式に当てはめると

(Q ー N * t)・ N - d = 0;

平面方程式のdは、Nと点Pの内積なので(ax+by+cz=dの、ax+by+czはabcとxyzの内積であるので)

(Q ー N * t)・ N - P ・ N = 0;

N ・は統一して

N ・((Q ー N * t) - P )= 0;

Nの内積を展開

N・Q − N・(N * t) − N・P = 0;

N・Q − N・P = N・(N * t);

N・(Q − P) = t(N・N);

両辺をN・Nで割ると

N・(Q − P) / (N・N) = t;

t = N・(Q − P) / (N・N);

で法線Nが正規化されてるとN・Nは1であるから

t = N・(Q − P);

とできる。 

点Pを使いたくないときは、もう少し展開して

t = N・Q − N・P;

平面方程式のdは法線Nと点Pの内積なので(ax+by+czはabcとxyzの内積)

t = N・Q − d;


距離 = 内積( 平面の法線、Q点座標 ) − 平面方程式のd;


C++


float distancePlaneToPoint(TPlane &plane, TVector &point)
{
return dot(plane.n, point) - plane.d;
};
2008年02月18日(月) 12:15:22 Modified by eruvasu




スマートフォン版で見る