【问题标题】:Mathematical issue (Increasing and deceasing two variables inside one loop)数学问题(在一个循环中增加和减少两个变量)
【发布时间】:2012-10-31 22:35:29
【问题描述】:

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

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

【问题讨论】:

  • 你想画一条线吗?
  • @JanDvorak 不,实际上这是一个动画,我想将一些盒子从西南移动到东北。
  • @JanDvorak 公平地说,他的讲述方式更有趣的是“我想画一条线”:-D
  • 反正逻辑和画线是一样的。

标签: java math graphics


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢!这是一种简单易行的方法。
【解决方案2】:

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


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

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

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

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

【讨论】:

  • 这只是一种方法,尽管是最简单的一种。 +1
  • 如果是关于线条绘制,Bresenham 肯定是一个不错的选择。
  • 如果他使用整数是有原因的,那么替代方法是在计算过程中使用 y 的“幕后”浮点版本。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-30
        • 2014-09-10
        • 1970-01-01
        • 1970-01-01
        • 2020-10-11
        相关资源
        最近更新 更多