Wie kann ich einen 3D-Punkt auf eine 3D-Linie projizieren?

20

Angenommen, ich habe eine Linie, die durch zwei Punkte definiert ist, Aund zwar Bbeide in der Form (x, y, z). Diese Punkte repräsentieren eine Linie im 3D-Raum.

Ich habe auch einen Punkt Pim selben Format definiert, der nicht auf der Linie steht.

Wie würde ich die Projektion dieses Punktes auf die Linie berechnen? Ich weiß, wie man das in 2D macht, aber 3D scheint alle Ressourcen zu haben.

EndOfTheZoners
quelle

Antworten:

29

Sie müssen lediglich den Vektor APauf den Vektor projizieren ABund dann den resultierenden Vektor zum Punkt hinzufügen A.

Hier ist eine Möglichkeit, es zu berechnen:

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

Diese Formel funktioniert in 2D und in 3D. In der Tat funktioniert es in allen Dimensionen.

sam hocevar
quelle
Vielen Dank, Herr Sam - wie haben Sie die obige Formel abgeleitet?
BKSpurgeon
2
Ich habe es nicht abgeleitet, es ist eine bekannte Formel, die Sie in vielen Handbüchern finden können.
Sam Hocevar
Gibt es ein Beispiel, wie man das in einer Programmiersprache wie C ++ schreibt?
Vinicius Rocha
1
@ViniciusdeMeloRocha Punkt wäre a.x*b.x+a.y*b.y+a.z*b.z ...alles andere ist so einfach wie die Operation pro Koordinate zwischen Vektoren.
Ocelot
4

Hier ist eine schnelle und einfache Möglichkeit, dies in Python zu tun:

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

Verwenden Sie Schwimmer; Wenn Ihre Vektoren Ganzzahlen enthalten, ist die Division eine Ganzzahldivision und die Ergebnisse sind falsch.

caleb c.
quelle
1
/dot(ab,ab)ist überflüssig
Waldo Bronchart