我正在使用根据x y坐标及其宽度和高度定义的矩形。我想出了如何根据坐标(x = cos(deg) * x - sin(deg) * y
y = sin(deg) * x + cos(deg) * y
)旋转它们,但我仍然坚持高度和宽度。我确信有一个明显的解决方案我不知道。如果重要,我正在使用Python。
编辑抱歉这个令人困惑的说明。我的目的是通过任何角度来使宽度和高度反转或取消。例如,在90度旋转中,值将切换。在180度旋转中,宽度将为负。另外,我只打算在我的脚本中使用90的倍数。我可以只使用if
语句,但我认为会有更“优雅”的方法。
答案 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)
轮换不应更改width
和height
。如果要围绕({0})deg
旋转(x,y),则等式是正确的,但请注意,cos
和sin
函数通常需要以弧度而不是度数的参数,因此您可能需要将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度旋转都会有效地交换宽度和高度,无论你旋转哪种方式。