C ++: вращение вектора вокруг определенной точки - PullRequest
15 голосов
/ 07 марта 2009

Я пытаюсь повернуть вектор вокруг определенной точки на векторе (в C ++):

1 2 3
4 5 6
7 8 9

вращение вокруг точки (1,1) (то есть "5") на 90 градусов приведет к:

7 4 1
8 5 2
9 6 3

Сейчас я использую:

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

Но я не хочу, чтобы оно вращалось вокруг (0,0)

Ответы [ 5 ]

27 голосов
/ 01 апреля 2009

Как Мехрдад Афшари прокомментировал сообщение Песто , включая перевод обратно в исходную систему координат:

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 голосов
/ 07 марта 2009

Решение состоит в том, чтобы перевести вектор в систему координат, в которой центр вращения равен (0,0). Примените матрицу вращения и переведите вектор обратно в исходную систему координат.

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

V2 = V - [dx, dy, 0]  
V3 = V2 * rotation matrix  
Result = V3 + [dx, dy, 0]
4 голосов
/ 07 марта 2009

Предполагая, что вы используете стандартную векторную реализацию, где (0,0) будет верхний левый угол, и вы вращаетесь вокруг точки (x_origin, y_origin), это должно быть сделано:

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

Обратите внимание, что у 'y_origin - y, потому что значение у увеличивается с понижением.

1 голос
/ 16 марта 2015

Я нашел ответ от Марка Бута неправильным (поверните (0,1,0) на 0 градусов, и вы получите (0, -1,0) с его формулой), и я получил:

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;

Конечно, это можно еще упростить, но я хочу сделать это как можно проще.

1 голос
/ 07 марта 2009

Вам нужно будет использовать матрицу перевода , чтобы переместить вращение вокруг другой точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...