2009-03-06 14 views
15

I auf dem Vektor einen Vektor um einen bestimmten Punkt zu drehen versuchen (in C++):C++: ein Vektor um einen bestimmten Punkt Rotierende

1 2 3 
4 5 6 
7 8 9 

um den Punkt gedreht (1,1) (das ist die "5") 90 Grad in ergäbe:

7 4 1 
8 5 2 
9 6 3 

im Moment bin ich mit:

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

Aber ich will nicht, es rotiert um (0,0)

+1

Geben Sie einen C++ - Code ein, der veranschaulicht, was Sie zu tun versuchen. –

Antwort

27

Wie Mehrdad Afshari kommentiert Pesto ‚s Post, wäre die Übersetzung wieder in das ursprüngliche Koordinatensystem einschließlich:

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 
11

Die Lösung besteht darin, den Vektor in ein Koordinatensystem zu übersetzen, in dem das Rotationszentrum (0,0) ist. Wenden Sie die Rotationsmatrix an und übersetzen Sie den Vektor zurück in das ursprüngliche Koordinatensystem.

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

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

Sie müssen eine translation matrix verwenden, um sich über einen anderen Punkt zu bewegen.

+0

http://mathworld.wolfram.com/RotationMatrix.html –

4

Angenommen, Sie sind mit einem Standard-Vektor-Implementierung, bei (0,0) würde die obere linke Ecke und Sie Drehung um den Punkt (x_origin, y_origin), dies sollte es tun:

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

Beachten Sie, dass die y y_origin - y sind, da der y-Wert zunimmt, wenn Sie nach unten gehen.

+7

Sie müssten es nach der Transformation zurückübersetzen. Das Ergebnis (x, y) befindet sich nicht im ursprünglichen Koordinatensystem. –

1

ich die Antwort von Marc Booth gefunden, falsch zu sein (drehen (0,1,0) von 0 Grad und Sie (0, -1,0) mit seiner Formel) erhalten, und ich landete mit:

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; 

Dies kann weiter natürlich vereinfacht werden, aber ich mag es so einfach machen wie möglich.

Verwandte Themen