Вращение точки вокруг другой точки (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;