¿Cómo puedo proyectar un punto 3D en una línea 3D?

20

Digamos que tengo una línea definida por dos puntos, Ay B, ambos en la forma (x, y, z). Estos puntos representan una línea en el espacio 3D.

También tengo un punto P, definido en el mismo formato, que no está en la línea.

¿Cómo calcularía la proyección de ese punto en la línea? Soy consciente de cómo hacer esto en 2D, pero 3D parece tener todos los recursos molestos.

EndOfTheZoners
fuente

Respuestas:

29

Simplemente necesita proyectar el vector APsobre el vector AB, luego agregue el vector resultante al punto A.

Aquí hay una forma de calcularlo:

A + dot(AP,AB) / dot(AB,AB) * AB

Esta fórmula funcionará en 2D y en 3D. De hecho, funciona en todas las dimensiones.

sam hocevar
fuente
gracias Sr. Sam, ¿cómo obtuvo la fórmula anterior?
BKSpurgeon
2
No lo deduje, es una fórmula bien conocida que puedes encontrar en muchos manuales.
sam hocevar
¿Hay una muestra sobre cómo escribir eso en un lenguaje de programación como C ++?
Vinicius Rocha
1
@ViniciusdeMeloRocha dot sería a.x*b.x+a.y*b.y+a.z*b.z ...todo lo demás es tan sencillo como la operación por coordenadas entre vectores.
Ocelot
4

Aquí hay una manera rápida y fácil de hacerlo en Python:

from numpy import *
def ClosestPointOnLine(a, b, p):
    ap = p-a
    ab = b-a
    result = a + dot(ap,ab)/dot(ab,ab) * ab
    return result

Use flotadores; Si sus vectores contienen números enteros, la división será una división entera, y los resultados serán incorrectos.

caleb c.
fuente
1
/dot(ab,ab)es redundante
Waldo Bronchart