Como posso projetar um ponto 3D em uma linha 3D?

20

Digamos que eu tenha uma linha definida por dois pontos Ae B, ambos no formulário (x, y, z). Esses pontos representam uma linha no espaço 3D.

Eu também tenho um ponto P, definido no mesmo formato, que não está em jogo.

Como eu calcularia a projeção desse ponto na linha? Estou ciente de como fazer isso em 2D, mas o 3D parece conter todos os recursos.

EndOfTheZoners
fonte

Respostas:

29

Você simplesmente precisa projetar o vetor APno vetor ABe adicionar o vetor resultante ao ponto A.

Aqui está uma maneira de calculá-lo:

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

Esta fórmula funcionará em 2D e em 3D. De fato, funciona em todas as dimensões.

sam hocevar
fonte
obrigado Sr. Sam - como você derivou a fórmula acima?
BKSpurgeon
2
Eu não deduzi, é uma fórmula bem conhecida que você pode encontrar em muitos manuais.
9789 Samus Hocevar #
Existe um exemplo de como escrever isso em uma linguagem de programação como C ++?
Vinicius Rocha
1
@ViniciusdeMeloRocha dot seria a.x*b.x+a.y*b.y+a.z*b.z ...tudo o resto é tão simples quanto a operação por coordenadas entre vetores.
Ocelot
4

Aqui está uma maneira rápida e fácil de fazer isso em 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

Use carros alegóricos; Se seus vetores contiverem números inteiros, a divisão será uma divisão inteira e os resultados estarão incorretos.

caleb c.
fonte
1
/dot(ab,ab)é redundante
Waldo Bronchart 4/17/17