Як я можу проектувати 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
Я цього не виводив, це добре відома формула, яку ви можете знайти в багатьох підручниках.
sam hocevar

Чи є зразок, як написати це мовою програмування, як 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.