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


20

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

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

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

Ответы:


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)избыточно
Уолдо Брончарт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.