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

如何识别小球碰撞地面与球杆后的轨迹方向变化点

问题描述

我已经完成小球的路径追踪,图像中的散点对应小球的x、y坐标。需要找出小球撞击地面(D1)和球杆(D2)的位置——这两种场景下小球的运动方向与角度会发生改变。我编写了如下计算两点间角度的代码,但输出结果不正确:

import math
v1_theta = math.atan2(y1, x1)
v2_theta = math.atan2(y2, x2)
degree = (v2_theta - v1_theta) * (180.0 / math.pi) 

其中x1、y1为小球上一位置坐标,x2、y2为小球当前位置坐标。请问如何找到小球角度与方向发生变化的点?

解决思路与修正方案

1. 修正角度计算的核心错误

你当前代码的问题在于,math.atan2(y, x)计算的是坐标点相对于原点的角度,而非小球的运动方向(位移向量的角度)。正确的做法是基于相邻两点的位移向量计算运动方向:

  • 对于连续两点(x_prev, y_prev)和(x_curr, y_curr),位移向量为dx = x_curr - x_prev、dy = y_curr - y_prev
  • 运动方向角度需用该位移向量计算:theta = math.atan2(dy, dx)

修正后的角度变化计算代码:

import math

# 计算第一段位移的方向角度(从(x1,y1)到(x2,y2))
dx_prev = x2 - x1
dy_prev = y2 - y1
theta_prev = math.atan2(dy_prev, dx_prev)

# 计算第二段位移的方向角度(从(x2,y2)到(x3,y3))
dx_curr = x3 - x2
dy_curr = y3 - y2
theta_curr = math.atan2(dy_curr, dx_curr)

# 转换为角度制并处理超过180度的情况
angle_change = abs(theta_curr - theta_prev) * (180.0 / math.pi)
if angle_change > 180:
    angle_change = 360 - angle_change

2. 识别撞击点的具体步骤

有了正确的角度变化计算后,按以下步骤定位撞击点:

  • 遍历所有连续三点组((x1,y1), (x2,y2), (x3,y3)),计算相邻两段位移的角度变化量
  • 设置角度变化阈值(比如10度,可根据实际场景调整),当角度变化量超过阈值时,中间点(x2,y2)即为疑似撞击点
  • 结合地面和球杆的位置约束进一步筛选:
    • 地面D1:若为水平地面,判断y2是否在地面y坐标的误差范围内(比如abs(y2 - ground_y) < 0.5)
    • 球杆D2:若球杆是固定线段,判断(x2,y2)是否在球杆线段的距离范围内(小于小球半径即可)

3. 优化方向

  • 若路径点采样频率高,先对坐标点做滑动平均平滑,减少噪声导致的误判
  • 也可用向量点积判断方向相似度,替代角度计算:
    dot_product = dx_prev * dx_curr + dy_prev * dy_curr
    mag_prev = math.hypot(dx_prev, dy_prev)
    mag_curr = math.hypot(dx_curr, dy_curr)
    # 余弦相似度,范围[-1,1],值越小方向差异越大
    similarity = dot_product / (mag_prev * mag_curr)
    
    当similarity小于设定阈值(比如0.8)时,即可判定方向发生显著变化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:55:20