2011-01-24 20 views
39

Ho un vettore euclideo a seduto alle coordinate (0, 1). Voglio ruotare a di 90 gradi (in senso orario) intorno all'origine: (0, 0).Rotazioni vettoriali 2D euclidee

Se ho una corretta comprensione di come dovrebbe funzionare, le coordinate risultanti (x, y) dopo la rotazione devono essere (1, 0). Se dovessi ruotarlo di 45 gradi (sempre in senso orario), invece, mi sarei aspettato che le coordinate risultanti fossero (0.707, 0.707).

theta = deg2rad(angle); 

cs = cos(theta); 
sn = sin(theta); 

x = x * cs - y * sn; 
y = x * sn + y * cs; 

utilizzando il codice di cui sopra, con un valore angle di 90,0 gradi, le coordinate risultanti sono: (-1, 1). E io sono così dannatamente confuso. Gli esempi visti nei seguenti link rappresentano la stessa formula mostrata sopra sicuramente?

Cosa ho fatto di sbagliato? Oppure ho frainteso come deve essere ruotato un vettore?

+0

Quali sono i tipi di tutte le variabili? –

+0

raddoppia, ma la risposta è stata abbastanza semplice, grazie a Caspar. – dcousens

+0

Inoltre, non è questo in senso antiorario? –

risposta

63

è necessario rimuovere le var dalla funzione:

x = x * cs - y * sn; // now x is something different than original vector x 
y = x * sn + y * cs; 

creare nuove coordinate diventa, per evitare il calcolo di x prima che raggiunga la seconda linea:

px = x * cs - y * sn; 
py = x * sn + y * cs; 
+3

Oh dio, avevo bisogno di occhi nuovi ... di nuovo qualcosa di così ovvio ... Grazie amico (funziona un bello, 2 ore più tardi ... haha) – dcousens

+0

quando esegui x = x * cs - y * sn ;, dà un valore diverso da x in y = x * sn + y * cs, quindi la x "deraglierà" –

+2

@Daniel: la x nella seconda istruzione ha avuto il suo valore modificato dal momento in cui è stata utilizzata per calcolare il valore per y . Quindi, in sostanza, hai calcolato la coordinata x per la rotazione (0,1) (che è -1). Quindi hai memorizzato questo nella coordinata x dando (-1,1) e poi hai calcolato la coordinata y per la rotazione (-1,1) (che dovrebbe effettivamente essere -1, quindi non sono sicuro di come hai ottenuto (-1 1) piuttosto che (-1, -1)). La risposta corretta, a proposito, non è (1,0), è (-1,0) poiché la rotazione per angoli positivi è in senso antiorario quando vista dall'alto. –

68

Rotazione un vettore di 90 gradi è particolarmente semplice.

(x, y) ruotato di 90 gradi intorno a (0, 0) è (-y, x).

Se si desidera ruotare in senso orario, lo si fa semplicemente al contrario, ottenendo (y, -x).

+14

+1. A chiunque stia ruotando un vettore 2D per uno schermo di un computer: questa risposta presuppone che l'asse y sia rivolto verso l'alto come in matematica. Se è puntato verso il basso come su schermi di computer, quindi in senso orario e antiorario sono invertiti. '(-y, x)' è in senso orario e '(y, -x)' è in senso antiorario. –

5

Si sta calcolando la parte y della nuova coordinata in base alla "nuova" parte x della nuova coordinata. In pratica questo significa che il calcolo della nuova produzione in termini di nuova potenza ...

Prova di riscrivere in termini di input e output:

vector2<double> multiply(vector2<double> input, double cs, double sn) { 
    vector2<double> result; 
    result.x = input.x * cs - input.y * sn; 
    result.y = input.x * sn + input.y * cs; 
    return result; 
} 

allora si può fare questo:

vector2<double> input(0,1); 
vector2<double> transformed = multiply(input, cs, sn); 

Nota come la scelta di nomi propri per le tue variabili può evitare tutto questo insieme!

5

Suoni più facile da fare con le classi standard:

std::complex<double> vecA(0,1); 
std::complex<double> i(0,1); // 90 degrees 
std::complex<double> r45(sqrt(2.0),sqrt(2.0)); 
vecA *= i; 
vecA *= r45; 

rotazione Vector è un sottoinsieme di moltiplicazione complessa ..

+0

nota che questo metodo non ha bisogno di calcolare seni o coseni – jeffythedragonslayer

+1

TBH perché "r45" è precalcolato. – MSalters

17

Ruota di 90 degress intorno 0,0:

x' = -y 
y' = x 

Ruota di 90 gradi attorno a px, py:

x' = -(y - py) + px 
y' = (x - px) + py 
Problemi correlati