2009-03-06 8 views
15

ja próbuje obrócić wektor wokół określonego punktu na wektorze (w C++):C++ Obracanie wektor wokół pewnego punktu

1 2 3 
4 5 6 
7 8 9 

obracana wokół punktu (1,1) (co jest na "5") 90 stopni spowoduje:

7 4 1 
8 5 2 
9 6 3 

prawo obecnie używam:

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

Ale nie chcę go obracać wokół (0,0)

+1

Opublikuj kod C++ ilustrujący to, co próbujesz zrobić. –

Odpowiedz

27

Jak Mehrdad Afshari skomentował postu Pesto „s, w tym tłumaczenie z powrotem do pierwotnego układu współrzędnych byłoby:

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

Rozwiązaniem jest przetłumaczenie wektora na układ współrzędnych, w którym znajduje się środek obrotu (0,0). Zastosuj macierz obrotu i przestaw wektor z powrotem do oryginalnego układu współrzędnych.

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

Będziesz musiał użyć translation matrix, aby przesunąć obrót wokół innego punktu.

+0

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

4

Zakładając, że używasz standardowego wdrożenia wektor Gdzie (0,0) będzie lewy górny róg i jesteś obraca się wokół punktu (x_origin, y_origin), powinien to zrobić:

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

Należy zauważyć, że wartości y są y_origin - y, ponieważ wartość y zwiększa się wraz z upływem czasu.

+7

Musisz przetłumaczyć go po transformacji. Wynik (x, y) nie znajduje się w oryginalnym układzie współrzędnych. –

1

Znalazłem odpowiedź od Marc Booth się błędne (obracać (0,1,0) od 0 stopni i masz (0, -1,0) z jego wzoru) i skończyło się z:

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; 

ten może być dalej uproszczone oczywiście, ale chcę, aby to tak proste, jak możliwy.