你可以用拉格朗日乘数来解决这个问题:
你知道平面上最近的点一定是这样的:
c = p + v
其中c 是最近点,v 是沿平面的向量(因此与法线n 正交)。您正在尝试找到具有最小范数(或范数平方)的c。所以你试图最小化dot(c,c),以使v与n正交(因此dot(v,n) = 0)。
因此,设置拉格朗日:
L = dot(c,c) + lambda * ( dot(v,n) )
L = dot(p+v,p+v) + lambda * ( dot(v,n) )
L = dot(p,p) + 2*dot(p,v) + dot(v,v) * lambda * ( dot(v,n) )
对v(并设置为0)求导得到:
2 * p + 2 * v + lambda * n = 0
您可以通过在上面的等式中通过在n 的两边点积来解决 lambda
2 * dot(p,n) + 2 * dot(v,n) + lambda * dot(n,n) = 0
2 * dot(p,n) + lambda = 0
lambda = - 2 * dot(p,n)
再次注意dot(n,n) = 1 和dot(v,n) = 0(因为v 在平面内,而n 与其正交)。然后将lambda 代入以获取:
2 * p + 2 * v - 2 * dot(p,n) * n = 0
求解v得到:
v = dot(p,n) * n - p
然后将其插入c = p + v 以获取:
c = dot(p,n) * n
这个向量的长度是|dot(p,n)|,符号告诉你这个点是在原点的法向量方向,还是从原点的反方向。