Recursion virgin通过碰撞检测获得堆栈溢出错误

时间:2014-03-12 23:24:43

标签: java collision-detection physics collision game-physics

我有一个球类,它有位置,速度和加速度矢量作为属性。我的程序实例化两个球对象并根据它们之间的重力移动它们。

我的一切都运转良好,但我正在尝试实现一种碰撞检测功能,使球体彼此反弹。

以下是更新速度的方法:

    public Chaney2DVector collisionVelocity(Ball ball2)
{
    float x = velocity.x + ((ball2.mass / mass) * (ball2.velocity.x - 
            ball2.collisionVelocity(this).x));
    float y = velocity.y + ((ball2.mass / mass) * (ball2.velocity.y - 
            ball2.collisionVelocity(this).y));
    Chaney2DVector updatedVelocity = new Chaney2DVector(x,y);
    velocity = updatedVelocity;
    return velocity;

}

我使用了一种名为递归的方法,不是吗?这是我第一次尝试这样做,如果我做错了,请道歉。

当我的程序运行时,我在更新方法中激活了此碰撞条件:

    if (this.getDistance(ball2) < (this.radius + ball2.radius))
    {
        velocity = this.setVelocity(collisionVelocity(ball2).x,
                collisionVelocity(ball2).y);
    }

我希望这个程序将新的碰撞速度分配给每个球中的速度变量。当我运行程序时,球很好地相互移动。然而,当球碰撞时,它们不会反弹......它们在一个固定位置粘在一起,我得到一个堆栈溢出错误。我在别处读到这可能与终止条件有关,但我不知道这意味着什么。任何想法??

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

我写了一个简单的递归示例而没有终止条件。这个例子找不到任何结局。 Java将调用该方法,这会导致java再次调用该方法。一个无休止的故事:

public class Snippet {

    public static void main(String[] args) {
        recursionWithoutTerminatingCondition();
    }

    private static void recursionWithoutTerminatingCondition() {
        recursionWithoutTerminatingCondition();
    }

}

另一个例子要好得多。 Java将开始调用该方法,但会减少每个调用的参数值。这将导致结束:

public class Snippet {

    public static void main(String[] args) {
        recursionWithTerminatingCondition(20);
    }

    private static void recursionWithTerminatingCondition(int numberOfTimes) {
        if (numberOfTimes > 0)
            recursionWithTerminatingCondition(numberOfTimes - 1);
    }

}

根据您的具体情况:

  • 如果你声明,一个球的碰撞速度取决于另一个球的碰撞速度,那么java找不到解决方案。

为此类问题构建变通方法的一些常用方法:

  • 如果你声明,一个球的碰撞速度取决于另一个球的最后时间间隔的碰撞速度(所以上次计算的存储值),而不是java可以计算你的价值。
  • 或者你也可以让java计算第一个球的碰撞速度,假设另一个碰撞速度为0 。而不是使用计算出的碰撞速度来计算其他球的碰撞速度,等等。您可以声明,只要每次重新计算导致的变化小于0.01(或类似),java就可以停止重新计算值。
  • 或许还有一些其他公式,不依赖于其他球碰撞速度。

可悲的是,我的物理知识太短,无法帮助你解决公式:(