Самый простой способ повернуть прямоугольник

Я использую прямоугольники, определенные в терминах их координат 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+высотагрех(дэг).