С++: вращение вектора вокруг определенной точки
Я пытаюсь повернуть вектор вокруг некоторой точки на векторе (в С++):
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)
Ответы
Ответ 1
Как Мехрдад Афшари прокомментировал сообщение Pesto, включая перевод обратно в исходную систему координат
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
Ответ 2
Решение состоит в том, чтобы перевести вектор в систему координат, в которой центр вращения равен (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]
Ответ 3
Предполагая, что вы используете стандартную векторную реализацию, где (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 y_origin - y
, потому что значение y увеличивается по мере того, как вы опускаетесь.
Ответ 4
Вам нужно будет использовать матрицу переводов, чтобы перемещаться в другую точку.
Ответ 5
Я нашел ответ от Marc Booth ошибочным (поверните (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;
Это, конечно, может быть упрощено, но я хочу сделать его максимально простым.