如何获取旋转矩形的顶点?旋转矩阵实现仅角度为0时有效
问题分析与解决
你的代码有两个核心问题:
- 旋转逻辑错误:旋转操作应该针对顶点相对于矩形中心的偏移量,而不是直接用顶点的绝对坐标。直接旋转绝对坐标会让矩形的中心偏离预设位置,同时破坏矩形的直角结构。
- 代码笔误:
x2y2和x4y4的计算存在明显错误,比如x2y2的y分量误用了x1y10[1],x4y4的x和y分量计算完全错误,这直接导致非0角度时顶点混乱。
修正后的代码
import random import numpy as np def rand_angle(): # 假设这个函数返回0到2π之间的随机弧度 return random.uniform(0, 2 * np.pi) def main_rec(): width = random.randint(150, 250) height = random.randint(150, 250) angle = rand_angle() c, s = np.cos(angle), np.sin(angle) R = np.array(((c, -s), (s, c))) center = np.array([random.randint(0, 640), random.randint(0, 480)]) # 定义相对于中心的四个原始顶点偏移量(未旋转的矩形) rel_points = np.array([ [-width/2, height/2], # 左上 [width/2, height/2], # 右上 [width/2, -height/2], # 右下 [-width/2, -height/2] # 左下 ]) # 旋转偏移量,再加上中心坐标得到最终顶点 rotated_points = (rel_points @ R.T) + center # 转换为元组列表(保持原返回格式) points = [tuple(p) for p in rotated_points] # 转换为角度返回 return points, np.rad2deg(angle)
关键修正点
- 使用相对坐标旋转:先计算每个顶点相对于中心的偏移,旋转这个偏移量后再加上中心坐标,确保旋转围绕矩形中心进行,不会破坏矩形的形状。
- 修正笔误:完全重构了顶点计算逻辑,避免了原代码中的手动计算错误,利用numpy矩阵运算让代码更简洁且不易出错。
- 用
np.rad2deg替代手动转换:更准确且符合numpy规范。
这样修改后,无论旋转角度是多少,生成的矩形都会保持直角,且中心位置正确。
内容的提问来源于stack exchange,提问作者dthedog
相关产品推荐
相关产品推荐

