让我进一步解释我的问题。假设我的速度是-5.4028000,我希望它能像这样回到零。
-5.4,
-5.3,
-5.2
...
-0.2,
-0.1,
0正数也一样。每运行一次,它们就会返回到0。因为这将放在更新循环中。
我尝试过的事情:
if(vx > 0)
{
vx-=0.1;
}
if(vx < 0)
{
vx+=0.1;
}但这只会把我的VX锁在:
VX:0.04999999
或
VX:0.09999999
发布于 2015-09-14 16:17:29
您的数字没有返回到零的原因是最后一次减法可能是由于舍入错误而减去了错误的数字。因为无论是5.4还是0.1都不能精确地表示为double格式,所以您的最后一个减法(或在负数情况下的最后一个加法)将“超调”。
这对于Math.min(...)和Math.max(...)来说是个问题。基本上,我们只会加或减去我们需要达到零的确切数量。
if (vx > 0) {
vx -= Math.min(0.1, vx);
}
if (vx < 0) {
vx += Math.min(0.1, -vx);
}发布于 2015-09-14 16:19:40
您需要确保最后的增量/减少不大于数字的大小:
if(vx > 0) {
vx -= Math.min(0.1, vx);
}
if(vx < 0) {
vx += Math.min(0.1, Math.abs(vx));
}发布于 2015-09-14 16:23:25
假设您希望每秒的变化率为0.1,并且不使用任何花哨的库,那么您可以这样做:
while (Math.abs(vx) - 0.1 > 0.0) {
vx += -Math.signum(vx) * 0.1
Thread.sleep(1000)
}
vx = 0.0;https://stackoverflow.com/questions/32569248
复制相似问题