Python实现矩阵指定角度顺/逆时针旋转函数的bug修复
矩阵旋转函数负角度失效问题排查
问题背景
我正在尝试编写一个名为rotateByX的函数,该函数接收两个参数:一个4x4矩阵,以及代表矩阵旋转角度的数值。传入的角度为90、180、270、360等90的整数倍数值:若传入角度为正,矩阵沿顺时针方向向右旋转;若传入角度为负(如-90、-180等),矩阵沿逆时针方向向左旋转。我此前已经实现了仅支持90度顺时针旋转的同类功能,在本次代码中我复用了该功能,同时额外编写了实现90度逆时针旋转的函数,计划根据传入的角度值调用对应函数完成矩阵旋转。
问题代码
def rotate90_Counter(m): return [[m[j][i] for j in range(len(m))] for i in range(len(m[0])-1,-1,-1)] def rotateByX(m,X): rotations = (X//90)%4 if X >= 0: for p in range(rotations): m= rotate90_clockwise(m) elif X < 0: for s in range(rotations): m= rotate_90_Counter(m) return m m = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]] rotateByX(m, -90)
故障表现
当前代码仅在传入角度X为正值时可正常运行,传入90、180、270等正角度时旋转结果完全符合预期;但传入负角度时,矩阵未按预期沿逆时针方向向左旋转,反而沿顺时针方向向右旋转。
问题根因
- 旋转次数计算逻辑错误:Python整数除法对负数做向下取整,
-90//90的运算结果是-1,再对4取模(-1) % 4得到结果3。也就是说传入-90度时,代码算出的rotations值为3,执行3次逆时针旋转的效果等同于1次顺时针旋转,自然和预期结果相反。 - 函数名拼写不匹配:自定义的逆时针旋转函数名为
rotate90_Counter,负角度分支中调用的却是rotate_90_Counter,实际运行时会直接抛出名称错误,需要统一命名。
修复方案
- 拆分正负角度的旋转次数计算逻辑:正角度沿用原有顺时针旋转次数计算方式,负角度单独计算逆时针旋转次数,不再共用同一套取模公式。
- 统一逆时针旋转函数的命名,消除名称错误。
修复后的可运行代码如下:
# 注:rotate90_clockwise为你已实现的顺时针旋转函数,此处补全通用实现用于测试 def rotate90_clockwise(m): n = len(m) return [[m[n-1-j][i] for j in range(n)] for i in range(n)] def rotate90_Counter(m): return [[m[j][i] for j in range(len(m))] for i in range(len(m[0])-1,-1,-1)] def rotateByX(m,X): if X >= 0: rotations = (X // 90) % 4 for _ in range(rotations): m = rotate90_clockwise(m) else: # 负角度转成正数计算逆时针旋转次数 rotations = (-X // 90) % 4 for _ in range(rotations): m = rotate90_Counter(m) return m m = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]] print(rotateByX(m, -90))
逻辑验证:传入-90度时旋转次数计算为1,仅执行1次逆时针旋转,结果符合预期;传入-180度时旋转2次,和顺时针旋转2次效果一致;传入-270度时旋转3次,等效于顺时针旋转1次,所有角度场景逻辑自洽。
内容的提问来源于stack exchange,提问作者Kev
相关产品推荐
相关产品推荐

