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.