关于求点到面的距离
本方法有前提,已知点M(x_0,y_0,z_0)和已知面(Ax + By + Cz + D = 0)的表达式
1、首先通过三个点计算出两个向量N1, N2 ;
N1 =(C-A), N2 = (B-A);
2、计算两个向量的叉乘结果,以拿到法向量
叉乘的几何意义:
设 c = a × b
则c的方向垂直于a与b所决定的平面,c的指向按右手定则从a转向b来确定。
且c的长度在数值上等于以a,b,夹角为θ组成的平行四边形的面积。
∣c∣=∣a∣∣b∣⋅sinθ
叉乘的算法:这里的vector是Vector3的形式,也就是三个数,x,y,z。
(Vector1.y * Vector2.z - Vector1.z * Vector2.y,
Vector1.z * Vector2.x - Vector1.x * Vector2.z,
Vector1.x * Vector2.y - Vector1.y * Vector2.x);
3、法向量归一化
Vector3 rVec;
double normalise()
{
//首先计算长度
double dLength = sqrt(rVec 点乘 rVec);
if(dLength > 0,0)
{
double dInvLength = 1.0 / dLength;
for(int i = 0; i < 3; ++i)
{
rVec[i] *= dInvLength;
}
}
return dLength;
}
4、开始求距离
归一化其实是优化去下面的公式的部分,可以完全按照公式做,而不需要第三步
如果法向量是单位向量,则分母为1.
点相对于某个面的镜像位置
已知点M(x_0,y_0,z_0)和距离之后,根据右手定则,直接M点加或者减两倍的距离就可以了。
证明平面方程的前三个系数是法向量
变换方程为一般式Ax+By+Cz+D=0,平面的法向量为(A,B,C)。
证明:设平面上任意两点P(x1,y1,z1),Q(x2,y2,z2)
∴ 满足方程:Ax1+By1+Cz1+D=0,Ax2+By2+Cz2+D=0
∴ PQ的矢量为(x2-x1,y2-y1,z2-z1),该矢量满足A(x2-x1)+B(y2-y1)+C(z2-z1)=0
∴ 矢量PQ⊥矢量(A,B,C)
∴ 平面上任意直线都垂直于矢量(A,B,C)
∴ 矢量(A,B,C)垂直于该平面
∴ 平面的法向量为(A,B,C)
求垂足的推导过程
https://blog.youkuaiyun.com/weixin_42165981/article/details/100547144
已知点P(a,b,c),计算点P到面Ax + By + Cz + D = 0的垂足,也就是点P在平面上的投影M(x0,y0,z0).
方法1:
显然点P和点M组成的直线l1和平面的法向量平行,则向量(A,B,C)(平面的法向量)是直线的方向向量。所以已知直线上一点和直线的方向向量,所以已知直线上一点和直线的方向向量,l1的参数方程:
(x -a)/A = (y - b)/B = (z - c)/C = t;
所以
x = At + a;
y = Bt + b;
z = Ct + c;
将x,y,z代入到平面方程
Ax+By+Cz+D
= A∗(At+a)+B∗(Bt+b)+C∗(Ct+c)+D
= A^2t+Aa+B^2t+Bb+C^2t+Cc+D
= (A^2+B^2+C^2)t+Aa+Bb+Cc+D
所以(A^2+B^2+C^2)t+Aa+Bb+Cc+D = 0;
所以t = -(Aa+Bb+Cc+D)/(A^2+B^2+C^2).
从而求出来投影点
x0 = (-A(Aa+Bb+Cc+D) + a(A^2+B^2+C^2))/(A^2+B^2+C^2)
y0 = (-B(Aa+Bb+Cc+D) + b(A^2+B^2+C^2))/(A^2+B^2+C^2)
z0 = (-C(Aa+Bb+Cc+D) + c(A^2+B^2+C^2))/(A^2+B^2+C^2)