点到平面的投影算法备忘笔记

来源:互联网 发布:苹果mac输入法切换 编辑:程序博客网 时间:2024/05/20 00:12
转自http://blog.csdn.net/coollen_mmx/article/details/4200489 

已知一个平面,其上一点O(一般是中心点),平面法线N。平面外一点P,求P点在平面上的投影。

这个问题在解数学题的时候不需要多想,按照已知条件带入公式求值计算即可,到最后会化简成几个多项式,可以用多种方法求解。比较麻烦的是用编程的方法计算多项式是件很麻烦的事情,至少在下觉得写出来的代码不会太好看。

为了使解决问题的思路更适合变成代码,在设计变量上最好只使用一个变量。在这个问题中,可以通过一个变量就能表示出来的是P在法线N上的投影点P’。我们可以通过求得P’的坐标从而计算出P在平面上的投影。

P’ = O + k * N

使用向量点乘公式:a * b = |a| * |b| * cos<a,b>,可以得到:

P’P * P’O = | P’P | * |P’O| * cos<P’P, P’O>

= | P’P | * |P’O| * cos 90°

= 0

又 P’P = P - P’ = P - (O + N * k) = P - O - N * k

P’O = O + N * k - O = N * k

得 (P - O - N * k) * N * k = 0

又 P,O已知,代码中可以直接计算,可以设V = P – O, 并且k可以约去

得 (V – N * k) * N = 0

展开 <(V.x – N.x * k), (V.y – N.y * k), (V.z – N.z * k)> * <N.x, N.y, N.z> = 0

整理 k = (V.x * N.x + V.y * N.y + V.z * N.z) / N.x^2 + N.y^2 + N.z^2

又 N.x^2 + N.y^2 + N.z^2是N的长度的平方,N是法线,长度为1

得 k = V.x * N.x + V.y * N.y + V.z * N.z

使用上面的求P’的式子可以算出P’的坐标。把P在平面O上的投影记作P’’,则:

P’’ = O + P’P