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)

Était-ce utile?

La solution

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top