Просто рассчитайте четыре угла вашего прямоугольника:
p1 = (x, y)
p2 = (x + w, y)
p3 = (x, y + h)
и поверните каждый на угол Вы хотите:
p1 = rotate(p1, angle)
# and so on...
и преобразуйте обратно в прямоугольное представление:
x, y = p1
w = dist(p1, p2) # the same as before rotation
h = dist(p1, p3)
где dist
вычисляет расстояние между двумя точками.
Редактировать: Почему бы вам не попробовать применить формулу, которую вы написали для (width, height)
пары?
x1 = cos(deg) * x - sin(deg) * y
y2 = sin(deg) * x + cos(deg) * y
Легко видеть, что если deg == 90
значения поменяются:
x1 = -y
y2 = x
и если deg == 180
они будут отрицаться:
x1 = -x
y2 = -y
и так далее ... Я думаю, это то, что Вы ищете.
Edit2:
А вот и функция быстрого вращения:
def rotate_left_by_90(times, x, y):
return [(x, y), (-y, x), (-x, -y), (y, -x)][times % 4]