Jak mogę rzutować punkt 3D na linię 3D?

20

Powiedzmy, że mam linię zdefiniowaną przez dwa punkty Ai Boba w formie (x, y, z). Punkty te reprezentują linię w przestrzeni 3D.

Mam również punkt Pzdefiniowany w tym samym formacie, który nie znajduje się na linii.

Jak obliczyć rzut tego punktu na linię? Wiem, jak to zrobić w 2D, ale wydaje się, że 3D ma w sobie wszystkie zasoby.

EndOfTheZoners
źródło

Odpowiedzi:

29

Wystarczy rzutować wektor APna wektor AB, a następnie dodać wynikowy wektor do punktu A.

Oto jeden ze sposobów, aby to obliczyć:

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

Ta formuła będzie działać w 2D i 3D. W rzeczywistości działa we wszystkich wymiarach.

sam hocevar
źródło
dziękuję, panie Sam - skąd wziął się powyższy wzór?
BKSpurgeon
2
Nie wyprowadziłem go, jest to dobrze znana formuła, którą można znaleźć w wielu podręcznikach.
sam hocevar
Czy jest próbka, jak to napisać w języku programowania, takim jak C ++?
Vinicius Rocha
1
@WiniciusdeMeloRocha kropka byłaby a.x*b.x+a.y*b.y+a.z*b.z ...wszystko inne jest tak proste, jak operacja na współrzędnych między wektorami.
Ocelot
4

Oto szybki i łatwy sposób, aby to zrobić w Pythonie:

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

Użyj pływaków; Jeśli wektory zawierają liczby całkowite, podział będzie działem całkowitym, a wyniki będą niepoprawne.

caleb c.
źródło
1
/dot(ab,ab)jest zbędny
Waldo Bronchart