JavaScript如何实现变量按指定速度平滑渐进趋近目标值?
平滑趋近插值实现方案
你之前用到的 x = (x + y) / 2 写法对负数、小数的处理都是完全正确的,本质是每次取当前值和目标值的中间值更新,不管目标值是正还是负,都能保证向目标趋近,且越靠近速度越慢。
如果要加入速度参数 z 控制趋近速率,只需要用通用的指数趋近公式即可:
x += (y - x) * z
- 这里的
z取值范围为(0,1],数值越大趋近速度越快 - 当
z=0.5时,公式等价于你原来的x = (x + y) / 2写法,完全对齐你之前的效果 - 该公式天然支持目标值中途修改:每次迭代都会基于最新的目标值
y计算,不需要额外处理变更逻辑
举个负数场景的验证示例,取 z=0.3,初始x=0,y=-2:
- 迭代1:x = 0 + (-2 - 0) * 0.3 = -0.6
- 迭代2:x = -0.6 + (-2 + 0.6) * 0.3 = -1.02
- 迭代3:x = -1.02 + (-2 + 1.02) * 0.3 = -1.314
可以看到负数场景下依然符合越靠近目标速度越慢的预期。
你原来的阈值终止逻辑可以直接复用,在每次更新x后执行即可:
const threshold = 0.125 // 可自定义阈值 if (Math.abs(y - x) < threshold) { x = y }
内容的提问来源于stack exchange,提问作者MirceaKitsune
相关产品推荐
相关产品推荐

