C ++: Rotation d'un vecteur autour d'un certain point
Question
J'essaie de faire pivoter un vecteur autour d'un certain point du vecteur (en C ++):
1 2 3
4 5 6
7 8 9
tourné autour du point (1,1) (qui est le "5") à 90 degrés aurait pour résultat:
7 4 1
8 5 2
9 6 3
En ce moment, j'utilise:
x = (x * cos(90)) - (y * sin(90))
y = (y * cos(90)) + (x * sin(90))
Mais je ne veux pas qu'il tourne autour (0,0)
La solution
Comme Mehrdad Afshari a commenté
Autres conseils
La solution consiste à traduire le vecteur en un système de coordonnées dans lequel le centre de rotation est (0,0). Appliquez la matrice de rotation et convertissez le vecteur dans le système de coordonnées d'origine.
dx = x of rotation center
dy = y of rotation center
V2 = V - [dx, dy, 0]
V3 = V2 * rotation matrix
Result = V3 + [dx, dy, 0]
En supposant que vous utilisez une implémentation vectorielle standard où (0,0) correspond au coin supérieur gauche et que vous faites pivoter le point (x_origin, y_origin), vous devriez le faire:
x = ((x - x_origin) * cos(angle)) - ((y_origin - y) * sin(angle))
y = ((y_origin - y) * cos(angle)) - ((x - x_origin) * sin(angle))
Notez que les y sont y_origin - y
car la valeur y augmente à mesure que vous descendez.
Vous devrez utiliser une matrice de traduction pour vous déplacer en rotation point différent.
J’ai trouvé que la réponse de Marc Booth était fausse (faites une rotation (0,1,0) de 0 degré et vous obtenez (0, -1,0) avec sa formule), et j’ai fini avec:
double cs = cos_deg(new_degrees);
double sn = sin_deg(new_degrees);
double translated_x = x - x_origin;
double translated_y = y - y_origin;
double result_x = translated_x * cs - translated_y * sn;
double result_y = translated_x * sn + translated_y * cs;
result_x += x_origin;
result_y += y_origin;
Cela peut évidemment être simplifié, mais je veux le rendre aussi simple que possible.