¿Cómo calculo el vector normal de un segmento de línea?


177

Supongamos que tengo un segmento de línea que va de (x1, y1) a (x2, y2). ¿Cómo calculo el vector normal perpendicular a la línea?

Puedo encontrar muchas cosas sobre hacer esto para planos en 3D, pero no hay cosas en 2D.

Por favor, tenga cuidado con las matemáticas (los enlaces a ejemplos trabajados, diagramas o algoritmos son bienvenidos), soy un programador más que un matemático;)


2
Y si quieres saber sobre las "matemáticas" detrás de esto, puedes buscar mi respuesta en stackoverflow.com/a/7470098/189767 . Es básicamente lo mismo, pero más elaborado.
Andreas

2
Esta pregunta es sobre matemáticas, no sobre programación.
Charlie

1
Estoy votando para cerrar esta pregunta como fuera de tema porque se trata de matemáticas, no de programación.
Pang

Respuestas:


237

si definimos dx = x2-x1 y dy = y2-y1, entonces las normales son (-dy, dx) y (dy, -dx).

Tenga en cuenta que no se requiere división, por lo que no corre el riesgo de dividir por cero.


14
Es bastante sutil y me llevó un tiempo darme cuenta de normal.x = -dy y normal.y = dx. Los tenía al revés porque parecía un error asignar la parte x para el valor y ...
Piku

@OrenTrutner Todavía no entiendo esto; (x', y') = (-y, x)y (x', y') = (y, -x)parece estar en lo cierto, pero ¿por qué uno usaría dxy dyaquí? Además, en función de las pendientes, m1 * m2 = -1para las líneas de ángulo recto, por lo tanto , dy' = dx' * (-dx/dy)y dx' = dy' * (-dy/dx)¿cómo se obtiene su ecuación normal.x = x' = -dy?
legends2k

1
¿Podría por favor informarme más sobre cómo el delta juega un papel aquí? Estoy seguro de que me falta algo aquí.
legends2k

77
@ legends2k: El delta es el vector tangente. Lo normal es la dirección perpendicular a la tangente. Voltear los valores x / y y negar uno se vuelve obvio si observa una matriz 2D para una rotación de 90 grados: en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations
geon

@geon: ¡Aah! Entendido, estaba confundiendo el delta con la pendiente, mientras que en geometría afinada la diferencia entre dos puntos es un vector, el tanget aquí :)
legends2k

95

Otra forma de pensarlo es calcular el vector unitario para una dirección dada y luego aplicar una rotación de 90 grados en sentido antihorario para obtener el vector normal.

La representación matricial de la transformación 2D general se ve así:

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

donde (x, y) son los componentes del vector original y (x ', y') son los componentes transformados.

Si t = 90 grados, entonces cos (90) = 0 y sin (90) = 1. Sustituirlo y multiplicarlo da:

x' = -y
y' = +x

El mismo resultado que se dio anteriormente, pero con un poco más de explicación de dónde proviene.


2
Muchas gracias, me estaba rompiendo la cabeza sobre cómo se estaba derivando.
legends2k

1
Aunque conocía la fórmula de rotación anteriormente, lo que hizo clic dentro de mi cabeza, por esta respuesta, fue que el ángulo es una constante (+/- 90), lo que lo simplifica a una simple negación e inversión de x e y.
legends2k

@duffymo ¿el resultado tiene una longitud de uno?
Martin Meeser

Si el vector se normaliza antes de la transformación, seguirá siéndolo después. Debe normalizar antes o después de realizar la transformación rotacional.
duffymo

11

Esta pregunta se publicó hace mucho tiempo, pero encontré una forma alternativa de responderla. Entonces decidí compartirlo aquí.
En primer lugar, uno debe saber que: si dos vectores son perpendiculares, su producto punto es igual a cero.
El vector normal (x',y')es perpendicular a la línea que conecta (x1,y1)y (x2,y2). Esta línea tiene dirección (x2-x1,y2-y1), o (dx,dy).
Entonces,

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

Hay muchos pares (x ', y') que satisfacen la ecuación anterior. Pero el mejor par que SIEMPRE satisface es (dy,-dx)o(-dy,dx)


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

si perpendicular dos líneas:

m1*m2 = -1

luego

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 es algo si quieres pasarlo desde un punto que definiste

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.