2009-08-07 28 views
139

Supponiamo di avere un segmento di linea che va da (x1, y1) a (x2, y2). Come si calcola il vettore normale perpendicolare alla linea?Come si calcola il vettore normale di un segmento di linea?

Sono in grado di trovare molte cose su come fare ciò per gli aerei in 3D, ma non in 2D.

Si prega di andarci piano con la matematica (link ad esempi pratici, diagrammi o algoritmi sono i benvenuti), io sono un programmatore più di quanto io sono un matematico;)

+2

E se vuoi sapere sulla "matematica" dietro questo, puoi cercare la mia risposta su http://stackoverflow.com/a/7470098/189767. È praticamente lo stesso, ma più elaborato. – Andreas

+1

Questa domanda riguarda la matematica, non la programmazione. – Charlie

+0

Sto votando per chiudere questa domanda come off-topic perché riguarda la matematica, non la programmazione. – Pang

risposta

194

se definiamo dx = x2-x1 e dy = y2-y1, quindi le normali sono (-dy, dx) e (dy, -dx).

Si noti che non è richiesta alcuna divisione e quindi non si rischia di dividere per zero.

+10

È piuttosto sottile e mi ci è voluto un po 'per realizzare normal.x = -dy e normal.y = dx.Ho avuto loro il contrario, perché sembrava un errore di battitura che assegna la parte x al valore y ... – Piku

+1

http://stackoverflow.com/a/7470098/183120 per più matematica su questo. – legends2k

+0

@OrenTrutner Ancora non lo capisco; '(x ', y') = (-y, x)' e '(x ', y') = (y, -x)' sembra giusto, ma perché si dovrebbe usare 'dx' e' dy'? Qui. Inoltre, in base alle pendenze, 'm1 * m2 = -1' per le linee ad angolo retto, quindi' dy '= dx' * (-dx/dy) 'e' dx '= dy' * (-dy/dx) ', come mai nella tua equazione 'normal.x = x '= -dy'? – legends2k

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

se perpendicolari due linee:

m1*m2 = -1 

poi

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 è qualcosa che se si desidera passare da un punto def ined

76

Un altro modo per pensarci è calcolare il vettore unitario per una data direzione e quindi applicare una rotazione in senso antiorario di 90 gradi per ottenere il vettore normale.

La rappresentazione matriciale della trasformazione 2D generale aspetto:

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

dove (x, y) sono le componenti del vettore originale e (x 'y') sono le componenti trasformati.

Se t = 90 gradi, poi cos (90) = 0 e il peccato (90) = 1. Sostituendo e moltiplicandolo fuori dà:

x' = -y 
y' = +x 

stesso risultato dato in precedenza, ma con un po 'di più spiegazione di dove proviene.

+1

Grazie mille, mi è venuta la testa su come si sarebbe derivato. – legends2k

+0

Anche se conoscevo la formula di rotazione in precedenza, la cosa che mi scattava in testa, con questa risposta, era che l'angolo era una costante (+/- 90), che lo semplicizzava con una semplice negazione e l'inversione di x e y. – legends2k

+0

@duffymo il risultato ha una lunghezza di uno? –

7

Questa domanda è stata inviata molto tempo fa, ma ho trovato un modo alternativo per rispondere. Quindi ho deciso di condividerlo qui.
In primo luogo, uno deve sapere che: se due vettori sono perpendicolari, il loro prodotto punto è uguale a zero.
Il vettore normale (x',y') è perpendicolare alla linea che collega (x1,y1) e (x2,y2). Questa riga ha direzione (x2-x1,y2-y1) o (dx,dy).
Quindi,

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

La sono molte coppie (x 'y') che soddisfano l'equazione di cui sopra. Ma la coppia migliore che SEMPRE soddisfa è o (dy,-dx) o (-dy,dx)

Problemi correlati