旋转矩形的最简单方法

7
我正在使用以x、y坐标和宽度、高度定义的矩形。我已经找到了如何根据坐标旋转它们的方法(x = cos(deg) * x - sin(deg) * y y = sin(deg) * x + cos(deg) * y),但是我卡在了高度和宽度上。我相信有一个明显的解决方案我没有想到。如果有关系的话,我正在使用Python。
编辑:对于混淆的描述表示抱歉。我的意图是由于角度不同,使宽度和高度反转或取反。例如,在90度旋转中,值将交换。在180度旋转中,宽度将为负。此外,我只打算在我的脚本中使用90的倍数。我可以使用if语句,但我认为应该有一种更“优雅”的方法。

“stuck on height and width”是什么意思?你说的高度和宽度是指最小/最大的X和Y坐标吗?旋转矩形不会改变其尺寸,所以你可能不是指这个。 - Jonathan Feinberg
1
小心 - 在您的正弦和余弦函数中,您一直在使用“deg”,但是您传递的数字需要是弧度。 180度= pi弧度,其中pi = 3.14159.... - duffymo
@duffymo ...这让我得出结论,熟悉的语法和将角度提供给三角函数而不是弧度的方式使它看起来像他在使用Python。很好,我正想在Python中实现这个 :) - Gustavo6046
不,我所知道的每种编程语言都使用弧度来进行三角函数计算。这也包括Python。 - duffymo
4个回答

5

只需计算矩形的四个角:

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

等等……我认为这正是您在寻找的内容。

编辑2:

下面是快速旋转函数:

def rotate_left_by_90(times, x, y):
    return [(x, y), (-y, x), (-x, -y), (y, -x)][times % 4]

2
适当的方法是使用变换矩阵。根据您的问题,我假设您想相对于(x=0,y=0)旋转,但如果不是这样,您需要考虑将矩形先平移到平面的中心(然后在旋转时再平移回来)。
M = 平移到中心的矩阵 R = 旋转矩阵
变换矩阵 = M^(-1) * R * M
但为了简单回答您的问题,只需取矩形的另外两个角并对它们应用相同的变换即可。
要了解更多关于变换矩阵的知识,请参见: http://en.wikipedia.org/wiki/Transformation_matrix

1

从您描述的只旋转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度实际上只是交换宽度和高度,无论您如何旋转。


没有特别的原因使用负值,只是因为它似乎最简单,并且我正在使用的库支持这种做法。 - user102430

1

旋转不应该改变widthheight。如果您想要以deg为中心将(x,y)旋转,那么您的方程式是正确的,但请注意,通常cossin函数期望弧度而不是角度作为参数,因此您可能需要将deg乘以pi/180(每度弧度)。

如果您需要在旋转后找到除(x,y)之外的其他矩形顶点的位置,则应将它们与(x,y)一起存储和旋转,或者保留有关矩形方向的某些信息(例如deg),以便您可以重新计算它们,例如x+widthcos(deg),y+heightsin(deg)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接