数学问题(在一个循环内增加和减少两个变量)

时间:2012-11-12 13:43:16

标签: java math graphics

我有一个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);                    
            }
        }

我怎么可能这样做。谢谢!

5 个答案:

答案 0 :(得分:4)

有两种解决方案,简单和复杂的解决方案。简单的一个:

y = yoff + (int)( (double) height * x / width )

其中yoff = 300, height = -100, width = 813-533。基本上,您执行浮点运算,然后对结果进行舍入。

或者,可以使用Bresenham line algorithm使用纯整数数学来完成相同的操作,但这需要更多的代码。

答案 1 :(得分:3)

y必须是doublefloat,您需要在想要使用它时对其值进行舍入。


如果你想做动画,只需看看内插器。您可以抽象计算极值之间的值的逻辑。

基本上在开始时,为插补器提供开始值和结束值。

然后,给插值器一个时间,它会返回该时间值的开始和结束之间的值。

奖励:它可以让您更改动画效果&amp;感觉没有触及其余的代码。 (你要做的事实上是一个线性插值,但是使用正弦函数,或者其他一些算法,如弹跳,二次,......)看起来会更好。

答案 2 :(得分:2)

它看起来像绘制线条的逻辑。 Bresenham的算法应该是最好的选择。

答案 3 :(得分:1)

保留一个帮助变量double dy,用于跟踪y的精确值。在每次迭代时,使用您的公式更新dy,然后通过获取dy的舍入/截断值来更新y。

答案 4 :(得分:1)

不确定您喜欢做什么,但您当前的解决方案是从浮点数舍入到整数。要避免这种情况,请使用浮点数/双精度计算,并在设置位置时将它们转换为整数。