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