Como calculo o vetor normal de um segmento de linha?


177

Suponha que eu tenha um segmento de linha que vai de (x1, y1) a (x2, y2). Como calculo o vetor normal perpendicular à linha?

Posso encontrar muitas coisas sobre isso em aviões em 3D, mas não em 2D.

Por favor, vá com calma na matemática (links para exemplos, diagramas ou algoritmos trabalhados são bem-vindos); sou mais programador do que matemático;)


2
E se você quiser saber sobre a "matemática" por trás disso, pode procurar minha resposta em stackoverflow.com/a/7470098/189767 . É basicamente o mesmo, mas mais elaborado.
Andreas

2
Esta pergunta é sobre matemática, não programação.
Charlie

1
Estou votando para fechar esta questão como fora de tópico, porque é sobre matemática, não sobre programação.
Pang

Respostas:


237

se definirmos dx = x2-x1 e dy = y2-y1, os normais são (-dy, dx) e (dy, -dx).

Observe que nenhuma divisão é necessária e, portanto, você não corre o risco de dividir por zero.


14
É bastante sutil e demorei um pouco para perceber normal.x = -dy e normal.y = dx. Eu tinha-lhes o contrário porque parecia que um erro de digitação atribuindo a x parte ao valor y ...
Piku

@OrenTrutner Eu ainda não entendo isso; (x', y') = (-y, x)e (x', y') = (y, -x)parece estar certo, mas por que alguém usaria dxe dyaqui. Além disso, com base em declives, m1 * m2 = -1para linhas de ângulo reto, portanto , dy' = dx' * (-dx/dy)e dx' = dy' * (-dy/dx)como é que vem sua equação normal.x = x' = -dy?
precisa saber é o seguinte

1
Poderia, por favor, falar um pouco mais sobre como o delta desempenha um papel aqui? Tenho certeza de que estou perdendo alguma coisa aqui.
precisa saber é o seguinte

7
@ legends2k: O delta é o vetor tangente. O normal é a direção perpendicular à tangente. Lançando os x / y valores e negando a pessoa se torna óbvio se você olhar para uma matriz 2D para 90 ° de rotação: en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations
Geon

@geon: Aah! Entendi, eu estava confuso delta com inclinação enquanto na geometria afim a diferença entre dois pontos é um vetor, o tanget aqui :)
legends2k

95

Outra maneira de pensar é calcular o vetor unitário para uma determinada direção e aplicar uma rotação de 90 graus no sentido anti-horário para obter o vetor normal.

A representação matricial da transformação 2D geral é assim:

x' = x cos(t) - y sin(t)
y' = x sin(t) + y cos(t)

onde (x, y) são os componentes do vetor original e (x ', y') são os componentes transformados.

Se t = 90 graus, então cos (90) = 0 e sin (90) = 1. Substituindo e multiplicando, obtém-se:

x' = -y
y' = +x

Mesmo resultado que o dado anteriormente, mas com um pouco mais de explicação de onde vem.


2
Graças a tonelada, estava quebrando minha cabeça sobre como estava sendo derivado.
precisa saber é o seguinte

1
Embora eu soubesse a fórmula de rotação mais cedo, o que clicou dentro da minha cabeça, por esta resposta, foi que o ângulo é uma constante (+/- 90), o que simplifica para uma simples negação e reversão de x e y.
precisa saber é o seguinte

@duffymo o resultado tem um comprimento de um?
Martin Meeser

Se o vetor for normalizado antes da transformação, permanecerá assim depois. Você precisa normalizar antes ou depois da transformação rotacional.
Duffymo

11

Esta pergunta foi publicada há muito tempo, mas encontrei uma maneira alternativa de respondê-la. Então eu decidi compartilhar aqui.
Primeiro, é preciso saber que: se dois vetores são perpendiculares, seu produto escalar é igual a zero.
O vetor normal (x',y')é perpendicular à linha de conexão (x1,y1)e (x2,y2). Esta linha tem direção (x2-x1,y2-y1), ou (dx,dy).
Assim,

(x',y').(dx,dy) = 0
x'.dx + y'.dy = 0

Existem muitos pares (x ', y') que satisfazem a equação acima. Mas o melhor par que SEMPRE satisfaz é um (dy,-dx)ou outro(-dy,dx)


7
m1 = (y2 - y1) / (x2 - x1)

se duas linhas perpendiculares:

m1*m2 = -1

então

m2 = -1 / m1 //if (m1 == 0, then your line should have an equation like x = b)

y = m2*x + b //b is offset of new perpendicular line.. 

b é algo se você quiser passar de um ponto que você definiu

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.