web-dev-qa-db-fra.com

Rotations vectorielles euclidiennes 2D

J'ai un vecteur euclidien a assis aux coordonnées (0, 1). Je souhaite faire pivoter a de 90 degrés (dans le sens des aiguilles d'une montre) autour de l'origine: (0, 0).

Si j'ai une bonne compréhension de la façon dont cela devrait fonctionner, les coordonnées résultantes (x, y) après la rotation devraient être (1, 0). Si je devais le faire pivoter de 45 degrés (toujours dans le sens des aiguilles d'une montre) à la place, je me serais attendu à ce que les coordonnées résultantes soient (0.707, 0.707).

theta = deg2rad(angle);

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

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

En utilisant le code ci-dessus, avec une valeur angle de 90,0 degrés, les coordonnées résultantes sont: (-1, 1). Et je suis tellement confus. Les exemples vus dans les liens suivants représentent la même formule montrée ci-dessus sûrement?

Qu'est ce que j'ai mal fait? Ou ai-je mal compris comment un vecteur doit être tourné?

46
deceleratedcaviar

vous devez supprimer les variables de la fonction:

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

créer de nouvelles coordonnées devient, pour éviter le calcul de x avant qu'il n'atteigne la deuxième ligne:

px = x * cs - y * sn; 
py = x * sn + y * cs;
70
Caspar Kleijne

Faire pivoter un vecteur de 90 degrés est particulièrement simple.

(x, y) pivoté de 90 degrés autour de (0, 0) est (-y, x).

Si vous souhaitez faire pivoter dans le sens des aiguilles d'une montre, il vous suffit de le faire dans l'autre sens, en obtenant (y, -x).

76

Rotation de 90 degrés autour de 0,0:

x' = -y
y' = x

Rotation de 90 degrés autour de px, py:

x' = -(y - py) + px
y' = (x - px) + py
19
Altivo

Cela semble plus facile à faire avec les classes 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;

La rotation vectorielle est un sous-ensemble de multiplication complexe.

5
MSalters

Vous calculez la partie y de votre nouvelle coordonnée en fonction de la "nouvelle" partie x de la nouvelle coordonnée. Fondamentalement, cela signifie que vous calculez la nouvelle sortie en termes de nouvelle sortie ...

Essayez de réécrire en termes d'entrée et de sortie:

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;
}

Ensuite, vous pouvez le faire:

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

Notez comment le choix de noms propres pour vos variables peut éviter ce problème ensemble!

5
xtofl