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é?
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;
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)
.
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
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.
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!