自定义rotate函数旋转矩形后网格方框位置排列错误问题求助
问题排查与修复
存在的两个核心错误
- 旋转函数公式错误:2D点绕中心旋转的公式中,x坐标计算时y方向偏移量误用了中心点x坐标,导致单个矩形旋转结果就存在偏差。
- 网格排布逻辑错误:先生成轴对齐的矩形位置再单独旋转每个矩形,会导致旋转后矩形的相对位置错乱,无法保持规整行列。
修正后的完整代码
import cv2 import numpy as np import math def rotate(points, angle): ANGLE = np.deg2rad(angle) c_x, c_y = np.mean(points, axis=0) # 修正旋转公式:y方向偏移量为py - c_y return np.array( [ [ c_x + math.cos(ANGLE) * (px - c_x) - math.sin(ANGLE) * (py - c_y), c_y + math.sin(ANGLE) * (px - c_x) + math.cos(ANGLE) * (py - c_y) ] for px, py in points ] ).astype(int) imgc = np.zeros((800, 800, 3), np.uint8) rotate_angle = 45 rad = np.deg2rad(rotate_angle) # 矩形尺寸和间距 box_size = 20 spacing = 25 # 旋转后的行列步长 dx_col = spacing * math.cos(rad) dy_col = spacing * math.sin(rad) dx_row = -spacing * math.sin(rad) dy_row = spacing * math.cos(rad) # 网格偏移量,避免画到画布外 offset_x = 300 offset_y = 200 for i in range(10): for j in range(10): # 计算当前矩形左上角的基准位置(按旋转后的网格排布) base_x = offset_x + j * dx_col + i * dx_row base_y = offset_y + j * dy_col + i * dy_row # 生成轴对齐的四个角点 p0 = (base_x, base_y) p1 = (base_x, base_y + box_size) p2 = (base_x + box_size, base_y + box_size) p3 = (base_x + box_size, base_y) # 旋转四个角点 p0, p1, p2, p3 = rotate((p0, p1, p2, p3), rotate_angle) pp = np.array([p0, p1, p2, p3]) cv2.drawContours(imgc, [pp], 0, (255, 255, 255), -1, cv2.LINE_AA) cv2.imshow("image", imgc) cv2.waitKey() cv2.destroyAllWindows()
关键修改说明
- 修复了rotate函数的公式错误,替换了错误的偏移量参数,保证单个矩形旋转角度正确。
- 重新设计了网格生成逻辑,按照旋转角度提前计算行列方向的步长,所有矩形的基准位置沿旋转后的坐标轴均匀排布,再对单个矩形做旋转,最终整体保持规整的行列结构。
- 调整了画布尺寸和偏移量,避免旋转后的矩形超出画布显示范围。
内容的提问来源于stack exchange,提问作者iyad
相关产品推荐
相关产品推荐

