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)

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top