在达到接近零之前,我可以将小数/小数乘以多少次

时间:2018-06-18 00:15:45

标签: javascript unity3d math game-engine game-physics

我正在尝试根据物体速度确定检查壁架的距离。这样物体就可以停止加速并让摩擦力停止。

enter image description here

问题

摩擦力为0.9 * horizo​​ntalSpeed每一步。

当horizo​​ntalSpeed小于0.001时,我们将horizo​​ntalSpeed设置为0

达到0.001所需的时间是horizo​​ntalSpeed = 1

我目前如何解决

var horizontalSpeed = 1    
var friction = 0.9
var closeEnoughToZero = 0.001
var distance = 0

while(horizontalSpeed > closeEnoughToZero) {
    horizontalSpeed *= friction
    distance += horizontalSpeed
}

console.log(distance) // 8.99

可能已经解决了我只是觉得它有点蛮力,可能是某种类型的数学函数,这对于此非常方便!

1 个答案:

答案 0 :(得分:2)

这是一个纯粹的数学"解决方案



var horizontalSpeed = 1    
var friction = 0.9
var closeEnoughToZero = 0.001
var distance = (horizontalSpeed * friction)/(1-friction)

console.log(distance)




或者,如果"足够接近零",那也可以在没有循环的情况下完成



var horizontalSpeed = 1    
var friction = 0.9
var closeEnoughToZero = 0.001
var distance = 0

// this is the power you need to raise "friction" to, to get closeEnoughToZero
let n = Math.ceil(Math.log(closeEnoughToZero)/Math.log(friction)); 
// now use the formula for Sum of the first n terms of a geometric series
let totalDistance = horizontalSpeed * friction * (1 - Math.pow(friction, n))/(1-friction);
console.log(totalDistance);




我使用Math.ceil的{​​{1}} - 在你的情况下是66.如果你为你的代码添加了一个循环计数器,你会看到循环执行66次

并且,正如您所看到的,第二个代码产生与循环完全相同的输出。