C ++: Drehen eines Vektors um einen bestimmten Punkt
Frage
Ich versuche, einen Vektor um einen bestimmten Punkt auf dem Vektor (in C ++) zu drehen:
1 2 3
4 5 6
7 8 9
um den Punkt gedreht (1,1) um 90 Grad (das die "5" ist) würde dazu führen, in:
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)
Lösung
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
Andere Tipps
Die Lösung ist es, den Vektor zu einem Koordinatensystem zu übersetzen, in dem der Drehmittelpunkt (0,0) ist. Tragen Sie die Rotationsmatrix und übersetzen den Vektor zurück in die 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]
Angenommen, Sie eine Standard-Vektor Implementierung verwenden, wo (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 die sind y_origin - y
, weil die y-Wert erhöht sich, wenn Sie nach unten gehen.
Sie müssen eine Übersetzung Matrix rel="nofollow verwenden drehen sich um ein zu bewegen anderer Punkt.
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 will es so einfach wie möglich machen.