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