Domanda

Sto cercando di ruotare un vettore attorno a un determinato punto del vettore (in C ++):

1 2 3
4 5 6
7 8 9

ruotato attorno al punto (1,1) (che è il "5") di 90 gradi comporterebbe:

7 4 1
8 5 2
9 6 3

In questo momento sto usando:

x = (x * cos(90)) - (y * sin(90))
y = (y * cos(90)) + (x * sin(90))

Ma non voglio che sia ruotato (0,0)

È stato utile?

Soluzione

Come Mehrdad Afshari ha commentato Il post di Pesto , inclusa la traduzione nel sistema di coordinate originale, sarebbe:

x_rotated = ((x - x_origin) * cos(angle)) - ((y_origin - y) * sin(angle)) + x_origin
y_rotated = ((y_origin - y) * cos(angle)) - ((x - x_origin) * sin(angle)) + y_origin

Altri suggerimenti

La soluzione è tradurre il vettore in un sistema di coordinate in cui il centro di rotazione è (0,0). Applica la matrice di rotazione e ritrasforma il vettore nel sistema di coordinate originale.

dx = x of rotation center  
dy = y of rotation center

V2 = V - [dx, dy, 0]  
V3 = V2 * rotation matrix  
Result = V3 + [dx, dy, 0]

Supponendo che tu stia utilizzando un'implementazione vettoriale standard in cui (0,0) sarebbe l'angolo in alto a sinistra e stai ruotando attorno al punto (x_origin, y_origin), questo dovrebbe farlo:

x = ((x - x_origin) * cos(angle)) - ((y_origin - y) * sin(angle))
y = ((y_origin - y) * cos(angle)) - ((x - x_origin) * sin(angle))

Nota che le y sono y_origin - y perché il valore y aumenta man mano che scendi.

Dovrai utilizzare una matrice di traduzione per spostare la rotazione attorno a una punto diverso.

Ho trovato la risposta di Marc Booth sbagliata (ruota (0,1,0) di 0 gradi e ottieni (0, -1,0) con la sua formula), e ho finito con:

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;

Naturalmente questo può essere ulteriormente semplificato, ma voglio renderlo il più semplice possibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top