Я пытаюсь сделать карточную игру, где карты разветвляются. Прямо сейчас, чтобы отобразить его, я использую Allegro API, который имеет функцию:
al_draw_rotated_bitmap(OBJECT_TO_ROTATE,CENTER_X,CENTER_Y,X
,Y,DEGREES_TO_ROTATE_IN_RADIANS);
так что с этим я могу легко сделать эффект вентилятора. Проблема в том, что вы знаете, какая карта находится под мышью. Чтобы сделать это, я подумал о проведении теста столкновения полигонов. Я просто не уверен, как повернуть 4 точки на карте, чтобы составить многоугольник. Мне в основном нужно сделать ту же операцию, что и Аллегро.
Например, 4 пункта карты:
card.x
card.y
card.x + card.width
card.y + card.height
Мне нужна функция вроде:
POINT rotate_point(float cx,float cy,float angle,POINT p)
{
}
Спасибо
Если вы повернете точку
(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.
источник
Система координат на экране левосторонняя, то есть координата x увеличивается слева направо, а координата y увеличивается сверху вниз. Начало координат O (0, 0) находится в верхнем левом углу экрана.
По часовой стрелке , вращение вокруг начала координат точки с координатами (х, у) задается следующими уравнениями:
где (x ', y') - координаты точки после поворота, а угол тета - угол поворота (должен быть в радианах, т.е. умножен на: 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) -> (px, py); (a, b) -> (cx, cy); тета -> угол:
источник
Для вращения по часовой стрелке:
Для вращения против часовой стрелки:
источник
c
иs
?c = cos(angle)
Это ответ Нильса Пипенбринка, но реализованный в c # fiddle.
https://dotnetfiddle.net/btmjlG
PS: Очевидно, я не могу комментировать, поэтому я обязан опубликовать это как ответ ...
источник