puede encontrar ese punto considerando en primer lugar un punto genérico (x, y)
largo de la línea de (x1, y1)
a (x2, y2)
:
x = x1 + t*(x2 - x1)
y = y1 + t*(y2 - y1)
y la computación en la (al cuadrado) distancia desde este punto de (xp, yp)
E = (x - xp)**2 + (y - yp)**2
que sustituyendo la definición de x
y y
da
E = (x1 + t*(x2 - x1) - xp)**2 +
(y1 + t*(y2 - y1) - yp)**2
a continuación para encontrar el mínimo de esta distancia que varía t
derivamos E
con respecto a t
dE/dt = 2*(x1 + t*(x2 - x1) - xp)*(x2 - x1) +
2*(y1 + t*(y2 - y1) - yp)*(y2 - y1)
que después de algún cálculo da
dE/dt = 2*((x1 - xp)*(x2 - x1) + (y1 - yp)*(y2 - y1) +
t*((x2 - x1)**2 + (y1 - y2)**2))
buscando cuando este derivado es cero obtenemos una ecuación explícita para t
t = ((xp - x1)*(x2 - x1) + (yp - y1)*(y2 - y1))/
((x2 - x1)**2 + (y2 - y1)**2)
por lo que el punto final se puede calcular utilizando ese valor para t
en la definición de (x, y)
.
Utilizando la notación vectorial esto es exactamente la misma fórmula sugerida por Gareth ...
t = <p - p1, p2 - p1>/<p2 - p1, p2 - p1>
donde la notación <a, b>
representa la operación de producto escalar ax*bx + ay*by
.
Tenga en cuenta también que la misma fórmula funciona en un espacio n-dimensional.
Gracias por esto. Te doy la respuesta aceptada ya que la tuya es la única que toma lo que sé (códigos cartesianos) y me da una fórmula real para conectarlos. (Me gusta la idea vectorial, pero eso genera más preguntas que respuestas dada mi memoria de geometría.) –
Es un esfuerzo heroico de @ 6502, pero esta respuesta muestra por qué tengo mi regla sobre los vectores. –
@gareth: Cuando me enfrento a un problema geométrico, siempre pienso en los vectores (es por eso que elevé tu respuesta), pero sé que la mayoría de los programadores no se sienten cómodos con ellos. – 6502