Вращение точки вокруг другой точки (2D)
Я пытаюсь сделать карточную игру, в которой карты разгоняются. Прямо сейчас, чтобы отобразить его, используя API Allegro, который имеет функцию:
al_draw_rotated_bitmap(OBJECT_TO_ROTATE,CENTER_X,CENTER_Y,X
,Y,DEGREES_TO_ROTATE_IN_RADIANS);
поэтому я могу легко сделать свой эффект вентилятора. Проблема в том, чтобы знать, какая карта находится под мышью. Для этого я подумал о проведении теста на столкновение с полигонами. Я просто не уверен, как повернуть 4 точки на карте, чтобы составить многоугольник. Мне в основном нужно выполнить ту же операцию, что и Allegro.
например, 4 точки карты:
card.x
card.y
card.x + card.width
card.y + card.height
Мне нужна функция вроде:
POINT rotate_point(float cx,float cy,float angle,POINT p)
{
}
Спасибо
Ответы
Ответ 1
Сначала вычтите опорную точку (cx,cy)
, затем поверните ее, затем снова добавьте точку.
Непроверенные:
POINT rotate_point(float cx,float cy,float angle,POINT p)
{
float s = sin(angle);
float c = cos(angle);
// translate point back to origin:
p.x -= cx;
p.y -= cy;
// rotate point
float xnew = p.x * c - p.y * s;
float ynew = p.x * s + p.y * c;
// translate point back:
p.x = xnew + cx;
p.y = ynew + cy;
return p;
}
Ответ 2
Если вы поворачиваете точку (px, py)
вокруг точки (ox, oy)
на угол тета, вы получите:
p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox
p'y = sin(theta) * (px-ox) + cos(theta) * (py-oy) + oy
это простой способ повернуть точку в 2D.
Ответ 3
Система координат на экране левая, т.е. координата x увеличивается слева направо, а координата y увеличивается сверху вниз. Происхождение, O (0, 0) находится в верхнем левом углу экрана.
![введите описание изображения здесь]()
A по часовой стрелке вращение вокруг начала координат точки с координатами (x, y) задается следующими уравнениями:
![введите описание изображения здесь]()
где (x ', y') - координаты точки после поворота и угла theta, угол поворота (должен быть в радианах, т.е. умножен на: PI/180).
Чтобы выполнить поворот вокруг точки, отличной от начала O (0,0), предположим, что точка A (a, b) (точка поворота). Сначала мы переводим точку, которая должна быть повернута, т.е. (X, y) обратно в начало координат, вычитая координаты точки поворота (x - a, y - b).
Затем мы выполняем поворот и получаем новые координаты (x ', y') и, наконец, переводим точку назад, добавляя координаты точки поворота к новым координатам (x '+ a, y' + b).
Следуя приведенному выше описанию:
2D по часовой стрелке, точка поворота точки (x, y) вокруг точки (a, b) равна:
Использование прототипа функции: (x, y) → (p.x, p.y); (a, b) → (cx, cy); theta → angle:
POINT rotate_point(float cx, float cy, float angle, POINT p){
return POINT(cos(angle) * (p.x - cx) - sin(angle) * (p.y - cy) + cx,
sin(angle) * (p.x - cx) + cos(angle) * (p.y - cy) + cy);
}
Ответ 4
float s = sin(angle); // angle is in radians
float c = cos(angle); // angle is in radians
Для вращения по часовой стрелке:
float xnew = p.x * c + p.y * s;
float ynew = -p.x * s + p.y * c;
Для против часовой стрелки:
float xnew = p.x * c - p.y * s;
float ynew = p.x * s + p.y * c;