鼠标围绕中心点旋转时角度检测代码仅触发2次而非预期4次的问题求助
嘿,我来帮你排查下这个问题!你现在遇到的情况是代码只触发了2次而非预期的4次,核心问题出在角度判断的逻辑上,咱们一步步拆解:
判断条件逻辑完全错误
你写的(degrees_angle - 90)%cycles==0这个条件根本达不到每90度检测一次的目的。虽然你设置了cycles=4想对应4次触发,但这个条件实际是在检查「(degrees_angle-90)是否是4的倍数」,这和你要找的90度间隔完全不沾边。
你要检测的是视觉上的0、90、180、270度,对应代码里计算的degrees_angle是90、180、270、360,这些数的共同特征是都是90的整数倍,所以正确的判断条件应该是degrees_angle % 90 == 0。还要注意避免重复触发
因为你每次给angle加0.1弧度(约5.73度),转换为整数的degrees_angle时,会在某个目标角度上停留好几次循环(比如从89.9度到90.1度之间,会有几次循环的degrees_angle都是90),如果不做处理会重复触发。你可以加一个集合来记录已经触发过的角度,避免重复操作:
先定义一个集合triggered_angles = set(),然后在判断时加上degrees_angle not in triggered_angles的条件,触发后把当前角度加入集合。角度对应关系再确认
你的代码是从顶部(视觉0度)开始逆时针旋转,对应代码里的初始angle=math.pi/2(90度),之后每转90度视觉角度,代码里的degrees_angle就增加90,所以用degrees_angle % 90 == 0正好能命中四个目标位置。
给你修改后的关键代码段参考:
import math import win32api import pyautogui import time cycles=4 triggered_angles = set() # 新增:记录已触发的角度,避免重复 position_list = [] radius = 110 xcentre = 500 # 替换成你的实际中心点x坐标 ycentre = 500 # 替换成你的实际中心点y坐标 angle = math.pi /2 while True: x= radius * math.cos(angle) y = radius * math.sin(-angle) win32api.SetCursorPos((int(x+xcentre), int(y+ycentre))) if angle >= 2*math.pi + math.pi/2: break degrees_angle = int(math.degrees(angle)) mx, my = pyautogui.position() print(degrees_angle) # 修改后的判断条件 if degrees_angle % 90 == 0 and degrees_angle not in triggered_angles: print("found") pyautogui.mouseDown(button='left') position_list.append(mx) position_list.append(my) triggered_angles.add(degrees_angle) # 标记该角度已触发 time.sleep(1) angle += 0.1
这样修改后,应该就能在四个目标位置都触发found操作了。
内容来源于stack exchange

