倒Y轴下基于斜率计算足球传球角度的技术问题求助
问题分析
你遇到的核心问题是np.arctan()无法区分斜率对应的象限——它只能返回-90°到90°之间的角度,当传球轨迹落在第二、第三象限时,计算结果就会出现偏差。再加上Y轴倒置(正值向下)的特殊坐标系,直接用斜率计算角度的方式无法适配所有方向的传球。
解决方案
改用np.arctan2()函数计算角度,它会根据x、y方向的变化量(而非斜率)直接确定角度所在的象限,完美适配所有方向的轨迹计算。同时结合Y轴倒置的特性调整y方向的变化量:
修正后的代码
# 计算x、y方向的变化量(从A点到B点) df['dx'] = df['X2'] - df['X'] # Y轴倒置,用A的Y减去B的Y,还原为正常坐标系的向上为正逻辑 df['dy'] = df['Y'] - df['Y2'] # 用arctan2计算弧度,参数顺序为(dy, dx) df['Radians'] = np.arctan2(df['dy'], df['dx']) # 转换为角度并约束在0-360°范围 df['Degrees'] = np.degrees(df['Radians']) % 360
测试用例验证
- A(40,48) → B(27,70):dx=-13,dy=48-70=-22 → 计算得≈240°,落在预期的210-230°区间(误差源于预期范围的近似性)
- A(27,74) → B(9,52):dx=-18,dy=74-52=22 → 计算得≈129.3°,符合130-140°的预期
- A(9,64) → B(11,45):dx=2,dy=64-45=19 → 计算得≈83.9°,和原结果一致且符合预期
补充说明
np.arctan2(y, x)的参数顺序是y变化量在前,x变化量在后,注意不要搞反- 最终用
%360将角度约束在0-360°范围内,方便后续判断传球方向:- 0°/360°、180°:横向传球
- 0°-90°、270°-360°:可结合
dy的正负进一步区分向前/向后传球 - 90°-270°:对应另一方向的横向或前后传球
内容的提问来源于stack exchange,提问作者Carlos Lozano
相关产品推荐
相关产品推荐

