Вы можете решить это с помощью множителей Лагранжа:
Вы знаете, что ближайшая точка на плоскости должна иметь вид:
c = p + v
Где c
- ближайшая точкаи v
- вектор вдоль плоскости (который, таким образом, ортогональн к n
, нормали).Вы пытаетесь найти c
с наименьшей нормой (или нормой в квадрате).Таким образом, вы пытаетесь свести к минимуму dot(c,c)
, при этом v
будет ортогональным к n
(таким образом dot(v,n) = 0
).
Таким образом, установите Lagrangian:
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
Youможно вычислить лямбду в приведенном выше уравнении путем точечного произведения обеих сторон на n
, чтобы получить
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)|
, и знак указывает, находится ли точка в направлении вектора нормали от начала координат или в обратном направлении от начала координат.