3

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

我怎么可能做到这一点。谢谢!

4

5 回答 5

4

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

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

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

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

于 2012-11-12T13:48:08.467 回答
3

y必须是 adouble或 afloat并且您需要在要使用它时对其值进行四舍五入。


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

基本上在一开始,你给你的插值器开始和结束值。

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

奖励:它将允许您更改动画的外观和感觉,而无需触及其余代码。(您尝试做的实际上是线性插值,但使用正弦函数或其他一些算法(如弹跳、二次等)看起来会更好。)

于 2012-11-12T13:45:32.163 回答
2

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

于 2012-11-12T13:46:46.627 回答
1

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

于 2012-11-12T13:48:45.930 回答
1

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

于 2012-11-12T13:49:30.713 回答