Unity 2D中如何判断鼠标指针是顺时针还是逆时针移动
检测鼠标移动的顺时针/逆时针方向
核心原理:叉积的符号判断方向
无论是判断鼠标轨迹的转向,还是绕固定点的旋转方向,核心都是利用2D向量叉积的符号:
对于两个向量v1(x1,y1)和v2(x2,y2),叉积计算公式为:
cross = x1 * y2 - y1 * x2
cross > 0:逆时针方向/转向cross < 0:顺时针方向/转向cross = 0:向量共线(鼠标沿直线移动)
场景1:判断鼠标轨迹的转向(连续曲线方向)
需要跟踪连续三个鼠标位置点,通过相邻移动向量的叉积判断轨迹转向。
通用代码示例(Python + Pygame)
import pygame pygame.init() screen = pygame.display.set_mode((800, 600)) clock = pygame.time.Clock() # 存储连续三个鼠标位置:前前点、前点 prev_prev_pos = None prev_pos = None running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False current_pos = pygame.mouse.get_pos() # 当有连续三个点时计算转向 if prev_prev_pos and prev_pos: # 计算相邻移动向量 v1_x = prev_pos[0] - prev_prev_pos[0] v1_y = prev_pos[1] - prev_prev_pos[1] v2_x = current_pos[0] - prev_pos[0] v2_y = current_pos[1] - prev_pos[1] # 计算叉积 cross = v1_x * v2_y - v1_y * v2_x # 加阈值过滤微小抖动,可按需调整 if cross > 10: print("逆时针转向") elif cross < -10: print("顺时针转向") # 更新位置记录 prev_prev_pos = prev_pos prev_pos = current_pos screen.fill((255,255,255)) pygame.display.flip() clock.tick(60) pygame.quit()
场景2:判断鼠标绕固定点的旋转方向
如果需要判断鼠标绕某个固定点(如屏幕中心)的旋转方向,只需计算固定点到前后鼠标位置的向量叉积。
通用代码示例(Python + Pygame)
import pygame pygame.init() screen = pygame.display.set_mode((800, 600)) clock = pygame.time.Clock() center_pos = (400, 300) # 自定义固定参考点 prev_pos = None running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False current_pos = pygame.mouse.get_pos() if prev_pos: # 计算固定点到前后位置的向量 v_prev_x = prev_pos[0] - center_pos[0] v_prev_y = prev_pos[1] - center_pos[1] v_curr_x = current_pos[0] - center_pos[0] v_curr_y = current_pos[1] - center_pos[1] cross = v_prev_x * v_curr_y - v_prev_y * v_curr_x if cross > 10: print("绕中心逆时针旋转") elif cross < -10: print("绕中心顺时针旋转") prev_pos = current_pos # 绘制参考点方便观察 screen.fill((255,255,255)) pygame.draw.circle(screen, (255,0,0), center_pos, 5) pygame.display.flip() clock.tick(60) pygame.quit()
关于带符号角度的补充
带符号角度的正负本质上和叉积符号一致,计算方式为atan2(v2.y, v2.x) - atan2(v1.y, v1.x),结果正则逆时针、负则顺时针,但叉积计算更高效,优先推荐叉积方案。
内容的提问来源于stack exchange,提问作者Kevin99
相关产品推荐
相关产品推荐

