2010-02-18 45 views
7

我使用的矩形定义根据他们的xy坐标和他们的宽度和高度。我想出了如何根据坐标旋转它们(x = cos(deg) * x - sin(deg) * yy = sin(deg) * x + cos(deg) * y),但我卡在高度和宽度上。我确信有一个明显的解决方案,我错过了。如果重要,我使用Python。最简单的方法来旋转一个矩形

编辑对不起,容易混淆的描述。我的目的是让宽度和高度反转或否定,不管角度如何。例如,在90度旋转中,值会切换。在180度旋转中,宽度将是负的。另外,我只打算在脚本中使用90的倍数。我可能只是使用if陈述,但我认为会有一个更“优雅”的方法。

+0

“卡住高度和宽度”是什么意思?那么高度和宽度呢?你是指最小/最大的X和Y坐标?旋转一个矩形不会改变它的尺寸,所以你可能不是这个意思。 – 2010-02-18 02:44:21

+1

小心 - 在正弦和余弦函数中继续使用“deg”,但传入的数字需要弧度。 180度=π弧度,其中pi = 3.14159 .... – duffymo 2010-02-18 02:56:40

+0

@duffymo ...这使我得出结论,熟悉的语法和方式度数喂养三角函数弧度intead使它看起来像他使用Python 。好,我期待在Python中实现这个功能:) – Gustavo6046 2016-10-26 23:02:52

回答

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度旋转有效地只是交换宽度和高度,无论你旋转的方式。

+0

对于负值没有特别的理由,除了它看起来最简单,我使用的库支持。 – tankadillo 2010-02-18 03:26:37

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

的正确方法是求助于变换矩阵。另外,从你的问题来看,我认为你想旋转(x = 0,y = 0),但是如果没有,你需要考虑这个问题并且首先将你的矩形转换到计划中心然后在执行旋转时将其翻译)。

M =矩阵,以转换为中心 R =旋转矩阵

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

但给你一个简单的回答你的问题,只是采取矩形的另外两个角落并对它们应用相同的转换。

要了解更多关于变换矩阵: http://en.wikipedia.org/wiki/Transformation_matrix

1

轮换不应该改变widthheight。如果您想通过deg围绕(0,0)旋转(x,y),则等式是正确的,但请注意,经常cossin函数预期参数的弧度而不是度数,所以您可能需要乘以deg乘以pi/180(弧度每度)。

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