Comment puis-je projeter un point 3D sur une ligne 3D?

20

Disons que j'ai une ligne définie par deux points, Aet B, tous deux dans le formulaire (x, y, z). Ces points représentent une ligne dans l'espace 3D.

J'ai également un point P, défini dans le même format, qui n'est pas sur la ligne.

Comment calculer la projection de ce point sur la ligne? Je sais comment faire cela en 2D, mais la 3D semble avoir toutes les ressources sur ce bugger.

EndOfTheZoners
la source

Réponses:

29

Il vous suffit de projeter le vecteur APsur le vecteur AB, puis d'ajouter le vecteur résultant au point A.

Voici une façon de le calculer:

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

Cette formule fonctionnera en 2D et en 3D. En fait, cela fonctionne dans toutes les dimensions.

sam hocevar
la source
merci monsieur Sam - comment avez-vous dérivé la formule ci-dessus?
BKSpurgeon
2
Je ne l'ai pas dérivé, c'est une formule bien connue que vous pouvez trouver dans de nombreux manuels.
sam hocevar
Existe-t-il un exemple sur la façon d'écrire cela dans un langage de programmation comme C ++?
Vinicius Rocha
1
@ViniciusdeMeloRocha dot serait a.x*b.x+a.y*b.y+a.z*b.z ...tout le reste aussi simple que l'opération par coordonnées entre les vecteurs.
Ocelot
4

Voici un moyen rapide et facile de le faire 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

Utilisez des flotteurs; Si vos vecteurs contiennent des entiers, la division sera une division entière et les résultats seront incorrects.

caleb c.
la source
1
/dot(ab,ab)est redondant
Waldo Bronchart