我有一个for循环,在该整数x中将从533增加到813。这意味着 280 个增量。在同一个循环中,当发生上述情况时,我想将 y 的值从 300 减少到 200。这意味着当 x 为 533 时,y 必须是 300,当 x 是 813 y 时,y 必须是 200。我知道这可以通过在每次迭代中将 y 的值减少 100/280 来实现。但两者都是整数。
这是我使用的一些代码示例,但它不起作用。
for(int i = 0; i < b.getSize(); i++) {
x = b.getCar(i).getPosX();
b.getCar(i).setPosX(++x);
if(x >= ((getWidth() / 2) - 140) && x < ((getWidth() / 2) + 140)){
y = b.getCar(i).getPosY();
y = (double)(y - (10.0f / 28.0f));
b.getCar(i).setPosY((int)y);
}
}
我怎么可能这样做。谢谢!
有两种解决方案,简单和复杂。简单的一个:
y = yoff + (int)( (double) height * x / width )
哪里yoff = 300, height = -100, width = 813-533
.基本上,您执行浮点运算,然后将结果四舍五入。
或者,也可以使用Bresenham线算法使用纯整数数学来完成相同的操作,但这需要更多的代码。
y
必须是double
或float
,当您想要使用它时,您需要四舍五入其值。
如果你想做动画,只需看看插值器。您可以抽象计算极值之间的值的逻辑。
基本上在开始时,你给你的插值器开始和结束值。
然后,您给插值器一个时间,它会返回该时间值的开始和结束之间的值。
奖励:它将允许您在不接触其余代码的情况下更改动画外观和感觉。(您尝试做的实际上是线性插值,但是例如使用正弦函数或其他一些算法(例如弹跳,二次函数等)看起来会更好。
它看起来像画一条线的逻辑。布雷森纳姆的算法应该是最好的选择。
保留一个帮助变量double dy
,用于跟踪 y 的精确值。在每次迭代中,使用公式更新 dy,然后通过取 dy 的舍入/截断值来更新 y。
你喜欢做什么,但你当前的解决方案从浮点数四舍五入到整数。 为避免这种情况,请使用浮点数/双精度进行计算,并在设置位置时将它们转换为整数。