已知一个平面,其上一点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