Как я могу спроецировать 3D точку на 3D линию?

20

Допустим, у меня есть линия, определяемая двумя точками Aи Bобеими в форме (x, y, z). Эти точки представляют собой линию в трехмерном пространстве.

У меня также есть точка P, определенная в том же формате, которой нет в строке.

Как бы я рассчитал проекцию этой точки на линию? Я знаю, как сделать это в 2D, но, похоже, в 3D есть все ресурсы.

EndOfTheZoners
источник

Ответы:

29

Вам просто нужно спроецировать вектор APна вектор AB, а затем добавить результирующий вектор в точку A.

Вот один из способов его вычисления:

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

Эта формула будет работать в 2D и 3D. На самом деле это работает во всех измерениях.

Сэм Хоцевар
источник
спасибо г-н Сэм - как вы получили приведенную выше формулу?
BKSpurgeon
2
Я не получил его, это хорошо известная формула, которую можно найти во многих руководствах.
Сам Хочевар
Есть ли пример того, как написать это на языке программирования, таком как C ++?
Виниций Роча
1
Точка @ViniciusdeMeloRocha будет такой a.x*b.x+a.y*b.y+a.z*b.z ...же простой, как и операция с координатами между векторами.
Оцелот
4

Вот быстрый и простой способ сделать это в 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

Использовать поплавки; Если ваши векторы содержат целые числа, деление будет целочисленным делением, и результаты будут неправильными.

Калеб с.
источник
1
/dot(ab,ab)избыточно
Уолдо Брончарт