Я использую прямоугольники, определенные с точки зрения их x y координаты и их ширина и высота. Я выяснил, как повернуть их с точки зрения координат (x = cos(deg) * x - sin(deg) * y
y = sin(deg) * x + cos(deg) * y
) но я застреваю на высоте и ширине. Я уверен, что существует очевидное решение, которое я пропускаю. Если это имеет значение, я использую Python.
редактирование Извините за запутывающее описание. Мое намерение состоит в том, чтобы получить ширину и высоту, или инвертированную или отрицаемую из-за того, что угол. Например, во вращении на 90 градусов значения переключились бы. Во вращении на 180 градусов ширина была бы отрицательна. Кроме того, я только намереваюсь использовать кратные числа 90 в моем сценарии. Я мог просто использовать if
операторы, но я предположил, что будет более "изящный" метод.
Судя по тому, как вы описываете поворот только на 90 градусов, и по тому, как вы определяете ширину и высоту, возможно, вы ищу что-то вроде
direction = 1 // counter-clockwise degrees
// or
direction = -1 // clockwise 90 degrees
new_height = width * direction
new_width = -height * direction
width = new_width
height = new_height
Не уверен, почему вы хотите иметь отрицательные значения для ширины и высоты… потому что в противном случае каждый поворот на 90 градусов просто меняет местами ширину и высоту, независимо от того, в какую сторону вы поворачиваете.
Просто вычислите четыре угла вашего прямоугольника:
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
вычисляет расстояние между двумя точками.
Изменить: Почему бы вам не попробовать применить формулу, которую вы написали, к паре (ширина, высота)
?
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]
Правильный способ - это прибегнуть к матрицам преобразования. Кроме того, судя по вашему вопросу, я полагаю, что вы хотите повернуть относительно (x = 0, y = 0), но если нет, вам нужно будет принять это во внимание и сначала перевести свой прямоугольник в центр плана (и затем переведите обратно, когда будет выполнено вращение).
M = Матрица для перевода в центр R = Матрица вращения
Матрица преобразования = M ^ (- 1) * R * M
Но чтобы дать вам простой ответ на ваш вопрос, просто возьмите два других угла прямоугольника и примените к ним то же преобразование.
Чтобы узнать больше о матрицах преобразования: http: //en.wikipedia.org / wiki / Transformation_matrix
Поворот не должен изменять ширину
и высоту
. Ваше уравнение верно, если вы хотите повернуть (x, y) вокруг (0,0) на deg
, но учтите, что часто функции cos
и sin
ожидают аргументы в радианах, а не в градусах, поэтому вам может потребоваться умножить град
на пи / 180
(радиан на градус).
Если вам нужно найти расположение других вершин прямоугольника помимо (x, y) после поворота, то вы должны либо сохранить и повернуть их вместе с (x, y), либо сохранить некоторую информацию об ориентации прямоугольника (например, градус ), поэтому вы можете пересчитать их, например, x + ширина cos (градусы), y + высота sin (градусы).