我有一个for循环,内部整数x将从533增加到813.这意味着280增量。在同一个循环中,我想在上面发生时将y的值从300减少到200。这意味着当x为533 y时必须为300,当x为813时,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);
}
}
我怎么可能这样做。谢谢!
答案 0 :(得分:4)
有两种解决方案,简单和复杂的解决方案。简单的一个:
y = yoff + (int)( (double) height * x / width )
其中yoff = 300, height = -100, width = 813-533
。基本上,您执行浮点运算,然后对结果进行舍入。
或者,可以使用Bresenham line algorithm使用纯整数数学来完成相同的操作,但这需要更多的代码。
答案 1 :(得分:3)
y
必须是double
或float
,您需要在想要使用它时对其值进行舍入。
如果你想做动画,只需看看内插器。您可以抽象计算极值之间的值的逻辑。
基本上在开始时,为插补器提供开始值和结束值。
然后,给插值器一个时间,它会返回该时间值的开始和结束之间的值。
奖励:它可以让您更改动画效果&amp;感觉没有触及其余的代码。 (你要做的事实上是一个线性插值,但是使用正弦函数,或者其他一些算法,如弹跳,二次,......)看起来会更好。
答案 2 :(得分:2)
它看起来像绘制线条的逻辑。 Bresenham的算法应该是最好的选择。
答案 3 :(得分:1)
保留一个帮助变量double dy
,用于跟踪y的精确值。在每次迭代时,使用您的公式更新dy,然后通过获取dy的舍入/截断值来更新y。
答案 4 :(得分:1)
不确定您喜欢做什么,但您当前的解决方案是从浮点数舍入到整数。要避免这种情况,请使用浮点数/双精度计算,并在设置位置时将它们转换为整数。