Вы можете найти эту точку, рассматривая сначала общую точку (x, y)
вдоль линии от (x1, y1)
до (x2, y2)
:
x = x1 + t*(x2 - x1)
y = y1 + t*(y2 - y1)
и вычисление (квадрат) расстояния от этой точки из (xp, yp)
E = (x - xp)**2 + (y - yp)**2
, что подстановка определения x
и y
дает
E = (x1 + t*(x2 - x1) - xp)**2 +
(y1 + t*(y2 - y1) - yp)**2
затем, чтобы найти минимум этого расстояния, изменяющегося t
, мы получаем E
относительно t
dE/dt = 2*(x1 + t*(x2 - x1) - xp)*(x2 - x1) +
2*(y1 + t*(y2 - y1) - yp)*(y2 - y1)
, что после некоторого вычисления дает
dE/dt = 2*((x1 - xp)*(x2 - x1) + (y1 - yp)*(y2 - y1) +
t*((x2 - x1)**2 + (y1 - y2)**2))
ища, когда эта производная равна нулю, мы получаем явное уравнение для t
t = ((xp - x1)*(x2 - x1) + (yp - y1)*(y2 - y1)) /
((x2 - x1)**2 + (y2 - y1)**2)
, поэтому конечная точка может быть вычислена с использованием этого значения для t
в определении (x, y)
.
Используя векторную запись, это точно та же формула, которую предложил Гарет ...
t = <p - p1, p2 - p1> / <p2 - p1, p2 - p1>
, где обозначение <a, b>
представляет операцию точечного произведения ax*bx + ay*by
.
Обратите внимание, что та же самая формула работает в n-мерном пространстве.