算法概述
平面由一点 O(x0,y0,z0) 和法向量 n→=(n1,n2,n3) 定义,平面外一点为 Pout(xp,yp,zp) ,求 P 到平面的投影点Q的坐标
设点Q的坐标为
- 点Q在平面内,满足平面方程(平面的点法式方程)
n1(x−x0)+n2(y−y0)+n3(z−z0)=0 (1)
-
PQ−→−//n→
,满足
xQ−xPn1=yQ−yPn2=zQ−zPn3 (2)
联立(1)(2)两式可以解得Q的坐标,得到
xQ=n1(x0n1+y0n2+z0n3)+(n22+n23)xP−n1n2yP−n1n3zPn21+n22+n23
根据
yQ=n2n1(xP−xQ)+yP (3)
以及
zQ=n3n1(xP−xQ)+zP (4)
得到Q的坐标,这里值得注意的是,求解(3)(4)的时候 n1 不能为0,当 n1 为0时 yQ=yP 且 zQ=zP
程序实现
下面用matlab实现上面这段程序
function point =compute_nearest_point_on_surface2(p,N,p_out)
x=(N(1)*(p(1)*N(1)+p(2)*N(2)+p(3)*N(3))+(N(2)^2+N(3)^2)*p_out(1)-N(1)*N(2)*p_out(2)-N(1)*N(3)*p_out(3))/(N(1)^2+N(2)^2+N(3)^2);
if (N(1)~=0)
y=N(2)/N(1)*(x-p_out(1))+p_out(2);
z=N(3)/N(1)*(x-p_out(1))+p_out(3);
else
y=p_out(2);
z=p_out(3);
end
point=[x,y,z];
end
well done!