最简单的旋转矩形的方法

时间:2010-02-18 02:39:06

标签: math geometry

我正在使用根据x y坐标及其宽度和高度定义的矩形。我想出了如何根据坐标(x = cos(deg) * x - sin(deg) * y y = sin(deg) * x + cos(deg) * y)旋转它们,但我仍然坚持高度和宽度。我确信有一个明显的解决方案我不知道。如果重要,我正在使用Python。

编辑抱歉这个令人困惑的说明。我的目的是通过任何角度来使宽度和高度反转或取消。例如,在90度旋转中,值将切换。在180度旋转中,宽度将为负。另外,我只打算在我的脚本中使用90的倍数。我可以只使用if语句,但我认为会有更“优雅”的方法。

4 个答案:

答案 0 :(得分: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计算两点之间的距离。

修改:为什么不尝试应用公式您已写入(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]

答案 1 :(得分:2)

正确的方法是求助于转换矩阵。另外,根据你的问题判断我想你想要相对于(x = 0,y = 0)旋转,但如果没有,你需要考虑到这一点并将你的矩形首先转换到计划的中心(和然后在进行旋转时将其翻译回来。)

M =要转换为中心的矩阵 R =旋转矩阵

转换矩阵= M ^( - 1)* R * M

但为了让您轻松回答您的问题,只需抓住矩形的另外两个角,然后对它们应用相同的转换。

要了解有关转换矩阵的更多信息: http://en.wikipedia.org/wiki/Transformation_matrix

答案 2 :(得分:1)

轮换不应更改widthheight。如果要围绕({0})deg旋转(x,y),则等式是正确的,但请注意,cossin函数通常需要以弧度而不是度数的参数,因此您可能需要将deg乘以pi/180(每度弧度)。

如果你需要在旋转后找到除(x,y)之外的其他矩形顶点的位置,那么你应该将它们与(x,y)一起存储和旋转,或者保留一些关于矩形方向的信息(例如deg) )所以你可以重新计算它们,例如x +宽度 cos(度),y +高度 sin(度)。

答案 3 :(得分: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度旋转都会有效地交换宽度和高度,无论你旋转哪种方式。