如何计算带摩擦力的小球运动模拟中抵达目标坐标的耗时
小球到达目标坐标的时间计算公式
核心原理
你的小球做的是方向恒定、受固定摩擦减速的匀变速直线运动,符合经典匀变速位移公式,直接通过一元二次方程求根即可得到所需时间。
公式推导
匀变速直线运动位移公式为:s = v₀t + ½at²
其中参数对应你的代码逻辑:
s:小球初始位置到目标的直线距离,单位为像素,对应代码Math.sqrt(dx*dx + dy*dy)v₀:初始每帧移动速度,对应代码velocity * 100(updateBall每100ms执行一次,乘以100得到每帧移动的像素数)a:加速度,摩擦减速时为负值,值为-friction * 100(每帧速度减少friction,对应每帧的加速度为负的该值)t:所需的updateBall执行帧数
整理为一元二次方程形式:0.5 * f * t² - v₀ * t + s = 0
(f为每帧减速度,值为friction * 100)
代入一元二次方程求根公式,取符合物理逻辑的较小正根(大根是速度降为负数后反向移动回到目标点的时间,不符合你速度降到0就停止的逻辑),得到帧数计算公式:t = (v₀ - √(v₀² - 2*f*s)) / f
转换为毫秒直接乘以100即可:总毫秒数 = t * 100
示例验证
你给出的测试参数:
- 目标距离
s ≈ 223.6068像素 - 初始每帧速度
v₀ = 0.05 * 100 = 5像素/帧 - 每帧减速度
f = 0.0003 * 100 = 0.03像素/帧²
代入计算得t ≈ 53.22帧,乘以100得到约5322毫秒,和你预期的5300ms完全吻合。
注意事项
- 计算前需要先判断
v₀² >= 2*f*s,如果该条件不成立,说明根号内为负数,小球减速到0时还没到达目标,无法抵达 - 代码中取
Math.floor(t)得到的是需要完整执行的updateBall次数,若需要更高精度可以额外计算剩余距离所需的时间补全
内容的提问来源于stack exchange,提问作者Eddi
相关产品推荐
相关产品推荐

