Math 旋转矩形的最简单方法

Math 旋转矩形的最简单方法,math,geometry,Math,Geometry,我使用的矩形是根据它们的xy坐标以及它们的宽度和高度定义的。我想出了如何用坐标(x=cos(deg)*x-sin(deg)*yy=sin(deg)*x+cos(deg)*y)来旋转它们,但我在高度和宽度上被卡住了。我肯定有一个明显的解决办法,我错过了。如果重要的话,我正在使用Python 编辑很抱歉,描述混乱。我的目的是得到宽度和高度,无论角度是什么,都是相反的或是相反的。例如,在90度旋转中,值将切换。在180度旋转中,宽度为负。此外,我只打算在脚本中使用90的倍数。我可以使用if语句,但我认

我使用的矩形是根据它们的xy坐标以及它们的宽度和高度定义的。我想出了如何用坐标(
x=cos(deg)*x-sin(deg)*y
y=sin(deg)*x+cos(deg)*y
)来旋转它们,但我在高度和宽度上被卡住了。我肯定有一个明显的解决办法,我错过了。如果重要的话,我正在使用Python


编辑很抱歉,描述混乱。我的目的是得到宽度和高度,无论角度是什么,都是相反的或是相反的。例如,在90度旋转中,值将切换。在180度旋转中,宽度为负。此外,我只打算在脚本中使用90的倍数。我可以使用
if
语句,但我认为会有一种更“优雅”的方法。

只需计算矩形的四个角:

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]

正确的方法是求助于变换矩阵。另外,从你的问题判断,我假设你想要相对于(x=0,y=0)旋转,但如果不是,你需要考虑到这一点,首先将矩形平移到平面的中心(然后在旋转时将其平移回来)

M=要平移到中心的矩阵 R=旋转矩阵

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

但是为了给你的问题一个简单的答案,只需要取矩形的另外两个角,并对它们应用相同的变换

要了解有关变换矩阵的更多信息,请执行以下操作:
旋转不应改变
宽度
高度
。如果您想将(x,y)旋转(0,0)约
deg
,那么您的公式是正确的,但是请注意,
cos
sin
函数通常需要以弧度而不是度为参数,因此您可能需要将
deg
乘以
pi/180
(弧度/度)


如果旋转后需要查找除(x,y)之外的其他矩形顶点的位置,则应将其与(x,y)一起存储并旋转,或保留有关矩形方向的一些信息(如deg),以便可以将其重新计算为例如x+宽度cos(deg),y+高度sin(deg).

从你描述旋转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度旋转都会有效地交换宽度和高度,而不管你以何种方式旋转。

你所说的“卡在高度和宽度上”是什么意思?高度和宽度呢?你是指最小/最大X和Y坐标吗?旋转矩形不会改变它的尺寸,所以你可能不是这个意思。小心-你一直在正弦和余弦函数中使用“deg”,但是你传入的数字必须是弧度。180度=π弧度,其中π=3.14159…@duffymo…这让我得出结论,熟悉的语法和弧度向三角函数馈送的方式使他看起来像是在使用Python。很好,我想在Python中实现这一点:)不,我知道的每种语言都使用弧度作为trig函数。这包括Python,没有特别的原因来解释负值,除了它看起来很简单,我正在使用的库也支持它。