You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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()

关键修改说明

  1. 修复了rotate函数的公式错误,替换了错误的偏移量参数,保证单个矩形旋转角度正确。
  2. 重新设计了网格生成逻辑,按照旋转角度提前计算行列方向的步长,所有矩形的基准位置沿旋转后的坐标轴均匀排布,再对单个矩形做旋转,最终整体保持规整的行列结构。
  3. 调整了画布尺寸和偏移量,避免旋转后的矩形超出画布显示范围。

内容的提问来源于stack exchange,提问作者iyad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:42:03