Math 给定旋转矩形的中心点和旋转角度,查找旋转矩形的角点

Math 给定旋转矩形的中心点和旋转角度,查找旋转矩形的角点,math,trigonometry,Math,Trigonometry,如果我知道一个矩形的中心点(在全局坐标空间中)、宽度和高度以及它围绕该中心点的旋转,有人能给我一个算法来找到它的四个角的位置吗 澄清编辑: 我指的宽度和高度是矩形边的长度。右上角有相对于中心的坐标w/2,h/2。旋转后,其绝对坐标为 x = cx + w/2 * Cos(Phi) - h/2 * Sin(Phi) y = cy + w/2 * Sin(Phi) + h/2 * Cos(Phi) 如果您需要所有的角点,那么创建从矩形中心到其两侧的两个垂直向量,然后向矩形中心添加/减去这些向量

如果我知道一个矩形的中心点(在全局坐标空间中)、宽度和高度以及它围绕该中心点的旋转,有人能给我一个算法来找到它的四个角的位置吗

澄清编辑:
我指的宽度和高度是矩形边的长度。

右上角有相对于中心的坐标w/2,h/2。旋转后,其绝对坐标为

 x = cx + w/2 * Cos(Phi) - h/2 * Sin(Phi)
 y = cy + w/2 * Sin(Phi) + h/2 * Cos(Phi)

如果您需要所有的角点,那么创建从矩形中心到其两侧的两个垂直向量,然后向矩形中心添加/减去这些向量以形成点可能会更快

这可能会更快,因为不需要重复调用sin()和cos()函数(每次只调用一次)

假设我们有一个向量库(用于更干净的代码-仅对向量算法有帮助),下面是Python中的代码:

def从矩形中获取角点(中心:矢量,角度:浮动,尺寸:矢量):
#创建(标准化的)垂直向量
v1=矢量(cos(角度)、sin(角度))
v2=矢量(-v1[1],v1[0])#旋转90
#按尺寸适当缩放它们
v1*=尺寸[0]/2
v2*=尺寸[1]/2
#通过向量移动矩形的中心来返回角点
返回[
中心+v1+v2,
中心-v1+v2,
中心-v1-v2,
中心+v1-v2,
]

每个顶点的坐标:

 Center point = (center.x, center.y)
 Angle        = angle
 Height       = height
 Width        = width      



TOP RIGHT VERTEX:
Top_Right.x = center.x + ((width / 2) * cos(angle)) - ((height / 2) * sin(angle))
Top_Right.y = center.y + ((width / 2) * sin(angle)) + ((height / 2) * cos(angle))



TOP LEFT VERTEX:
Top_Left.x = center.x - ((width / 2) * cos(angle)) - ((height / 2) * sin(angle))
Top_Left.y = center.y - ((width / 2) * sin(angle)) + ((height / 2) * cos(angle))



BOTTOM LEFT VERTEX:
Bot_Left.x = center.x - ((width / 2) * cos(angle)) + ((height / 2) * sin(angle))
Bot_Left.y = center.y - ((width / 2) * sin(angle)) - ((height / 2) * cos(angle))



BOTTOM RIGHT VERTEX:
Bot_Right.x = center.x + ((width / 2) * cos(angle)) + ((height / 2) * sin(angle))
Bot_Right.y = center.y + ((width / 2) * sin(angle)) - ((height / 2) * cos(angle))
此算法是以下3个步骤的压缩版本:

步骤1:将矩形围绕原点居中

步骤2:将旋转矩阵应用于每个顶点

步骤3:通过向每个坐标添加中心点,将旋转的矩形移动到正确的位置


这里更深入地解释了这一点

这是使用标准旋转矩阵[{css}{-scc}]的2D向量变换,其中c=cos(角度)和s=sin(角度)刚刚尝试了这一点,如果矩形没有旋转,这一点会起作用。这个公式给出了矩形角的坐标,旋转角度为φ。啊,好的,我只是插入了φ的实际值。谢谢你好您可以添加中间点吗?矩形有9个点。4个角点和4个中点(上中、下中、右中、左中)。@chitgoks如果我理解正确,我认为获得矩形边中点的最简单方法是在每个旋转的角点上使用中点公式。角度是使用Math.atan2得到的吗?@chitgoks如果我没记错的话,角度是以弧度表示的任意值。