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

Я использую прямоугольники, определенные с точки зрения их x y координаты и их ширина и высота. Я выяснил, как повернуть их с точки зрения координат (x = cos(deg) * x - sin(deg) * y y = sin(deg) * x + cos(deg) * y) но я застреваю на высоте и ширине. Я уверен, что существует очевидное решение, которое я пропускаю. Если это имеет значение, я использую Python.

редактирование Извините за запутывающее описание. Мое намерение состоит в том, чтобы получить ширину и высоту, или инвертированную или отрицаемую из-за того, что угол. Например, во вращении на 90 градусов значения переключились бы. Во вращении на 180 градусов ширина была бы отрицательна. Кроме того, я только намереваюсь использовать кратные числа 90 в моем сценарии. Я мог просто использовать if операторы, но я предположил, что будет более "изящный" метод.

7
задан tankadillo 18 February 2010 в 03:01
поделиться

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 градусов просто меняет местами ширину и высоту, независимо от того, в какую сторону вы поворачиваете.

1
ответ дан 7 December 2019 в 03:15
поделиться

Просто вычислите четыре угла вашего прямоугольника:

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]
5
ответ дан 7 December 2019 в 03:15
поделиться

Правильный способ - это прибегнуть к матрицам преобразования. Кроме того, судя по вашему вопросу, я полагаю, что вы хотите повернуть относительно (x = 0, y = 0), но если нет, вам нужно будет принять это во внимание и сначала перевести свой прямоугольник в центр плана (и затем переведите обратно, когда будет выполнено вращение).

M = Матрица для перевода в центр R = Матрица вращения

Матрица преобразования = M ^ (- 1) * R * M

Но чтобы дать вам простой ответ на ваш вопрос, просто возьмите два других угла прямоугольника и примените к ним то же преобразование.

Чтобы узнать больше о матрицах преобразования: http: //en.wikipedia.org / wiki / Transformation_matrix

2
ответ дан 7 December 2019 в 03:15
поделиться

Поворот не должен изменять ширину и высоту . Ваше уравнение верно, если вы хотите повернуть (x, y) вокруг (0,0) на deg , но учтите, что часто функции cos и sin ожидают аргументы в радианах, а не в градусах, поэтому вам может потребоваться умножить град на пи / 180 (радиан на градус).

Если вам нужно найти расположение других вершин прямоугольника помимо (x, y) после поворота, то вы должны либо сохранить и повернуть их вместе с (x, y), либо сохранить некоторую информацию об ориентации прямоугольника (например, градус ), поэтому вы можете пересчитать их, например, x + ширина cos (градусы), y + высота sin (градусы).

1
ответ дан 7 December 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: