如果我知道它的中心点(在全局坐标空间中),宽度和高度以及围绕该中心点的旋转,有人可以给我一个算法来找到矩形的所有四个角的位置吗?
澄清编辑: 我所指的宽度和高度是矩形边长。
答案 0 :(得分:4)
右上角有相对于中心的坐标w / 2,h / 2。旋转后,其绝对坐标为
x = cx + w/2 * Cos(Phi) - h/2 * Sin(Phi)
y = cy + w/2 * Sin(Phi) + h/2 * Cos(Phi)
答案 1 :(得分:1)
如果需要所有拐角,从矩形的中心到矩形的两边创建两个垂直向量,然后将这些向量与矩形的中心相加/相减,可能会更快一些。形成要点。
这可能会更快,因为您不需要重复调用sin()和cos()函数(每个函数仅执行一次)。
假设我们有一个Vector库(用于更干净的代码-仅有助于矢量算术),这是Python中的代码:
def get_corners_from_rectangle(center: Vector, angle: float, dimensions: Vector):
# create the (normalized) perpendicular vectors
v1 = Vector(cos(angle), sin(angle))
v2 = Vector(-v1[1], v1[0]) # rotate by 90
# scale them appropriately by the dimensions
v1 *= dimensions[0] / 2
v2 *= dimensions[1] / 2
# return the corners by moving the center of the rectangle by the vectors
return [
center + v1 + v2,
center - v1 + v2,
center - v1 - v2,
center + v1 - v2,
]
答案 2 :(得分:0)
每个顶点的坐标:
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步:通过将中心点添加到每个坐标,将旋转的矩形移动到正确的位置
https://math.stackexchange.com/questions/126967/rotating-a-rectangle-via-a-rotation-matrix
对此进行了更深入的解释。