Ответ 1
Следующая функция rotate
выполняет поворот точки point
на угол angle
(против часовой стрелки, в радианах) вокруг origin
, в декартовой плоскости, с обычными условными обозначениями оси: x, увеличивающийся слева справа, y увеличиваясь вертикально вверх. Все точки представлены как длина-2 кортежа формы (x_coord, y_coord)
.
import math
def rotate(origin, point, angle):
"""
Rotate a point counterclockwise by a given angle around a given origin.
The angle should be given in radians.
"""
ox, oy = origin
px, py = point
qx = ox + math.cos(angle) * (px - ox) - math.sin(angle) * (py - oy)
qy = oy + math.sin(angle) * (px - ox) + math.cos(angle) * (py - oy)
return qx, qy
Если ваш угол указан в градусах, вы можете сначала преобразовать его в радианы, используя math.radians
. Для вращения по часовой стрелке отрицайте угол.
Пример: вращение точки (3, 4)
вокруг начала координат (2, 2)
против часовой стрелки на угол 10 градусов:
>>> point = (3, 4)
>>> origin = (2, 2)
>>> rotate(origin, point, math.radians(10))
(2.6375113976783475, 4.143263683691346)
Обратите внимание, что некоторые очевидные повторные вычисления в функции rotate
: math.cos(angle)
и math.sin(angle)
вычисляются дважды, как и px - ox
и py - oy
. Я оставляю это для вас, чтобы определить это, если это необходимо.