Система координат на экране левосторонняя, то есть координата x увеличивается слева направо, а координата y увеличивается сверху вниз. Начало координат O (0, 0) находится в верхнем левом углу экрана.
A по часовой стрелке вращение вокруг начала координат точки с координатами (x, y) задается следующими уравнениями:
где (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) -> (p.x, p.y); (a, b) -> (cx, cy); тета -> угол:
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);
}