2009-08-07 21 views
139

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?¿Cómo calculo el vector normal de un segmento de línea?

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

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

+2

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

+1

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

+0

Voté para cerrar esta pregunta como fuera de tema porque se trata de matemáticas, no de programación. – Pang

Respuesta

194

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.

+10

Es bastante sutil y me tomó un tiempo realizar normal.x = -dy y normal.y = dx.Los tuve al revés porque parecía un error ortográfico al asignar la parte x al valor y ... – Piku

+1

http://stackoverflow.com/a/7470098/183120 para obtener más información matemática sobre esto. – legends2k

+0

@OrenTrutner Todavía no entiendo esto; '(x ', y') = (-y, x)' y '(x ', y') = (y, -x)' parece ser correcto, pero ¿por qué uno usaría 'dx' y' dy' aquí. Además, basado en pendientes, 'm1 * m2 = -1' para líneas de ángulo recto, por lo tanto' dy '= dx' * (-dx/dy) 'y' dx '= dy' * (-dy/dx) ', ¿Cómo es que en su ecuación 'normal.x = x '= -dy'? – legends2k

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

si dos líneas perpendiculares:

m1*m2 = -1 

continuación

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 desea pasar desde un punto que def ined

76

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 de la matriz de la transformación 2D en general se parece a esto:

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

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

Si t = 90 grados, entonces cos (90) = 0 y sen (90) = 1. Sustituyendo y multiplicándolo cabo da:

x' = -y 
y' = +x 

mismo resultado que antes indicado, pero con un poco más de explicación de dónde viene.

+1

Muchas gracias, me estaba rompiendo la cabeza sobre cómo se obtenía. – legends2k

+0

Aunque conocía la fórmula de rotación anterior, 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 y reversión de xey. – legends2k

+0

@duffymo ¿El resultado tiene una longitud de uno? –

7

Esta pregunta se ha publicado hace mucho tiempo, pero encontré una forma alternativa de responderla. Así que decidí compartirlo aquí.
En primer lugar, uno debe saber que: si dos vectores son perpendiculares, su producto de 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).
Así,

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

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

Cuestiones relacionadas