【问题标题】:Recursion virgin getting stack overflow error with collision detection递归处女通过碰撞检测获取堆栈溢出错误
【发布时间】:2014-04-17 10:35:11
【问题描述】:

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

我的一切工作都很好,但我正在尝试实现一种碰撞检测功能,使球相互反弹。

这里是更新速度的方法:

    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);
    }

我希望这个程序将新的碰撞速度分配给每个球的速度变量。当我运行程序时,球彼此移动得很好。但是,当球相撞时,它们不会反弹……它们在静止位置粘在一起,我得到一个堆栈溢出错误。我在其他地方读到这可能与终止条件有关,但我不知道这意味着什么。有什么想法吗??

非常感谢您的帮助!

【问题讨论】:

  • 递归的第一条规则是(不是“不要谈论递归”)总是有一个终止条件。您只需调用相同的方法,直到获得StackOverflowError。你需要一些条件来调用别的东西。
  • @BoristheSpider 那么在我的情况下,终止条件是什么样的?抱歉我的无知,但举个例子会很酷。
  • 看看this。请注意所有示例如何具有返回值而不是递归调用的条件。
  • @BoristheSpider 我查看了您的链接(谢谢,顺便说一句!)并了解您对终止条件的意思(我认为)。我不明白的是如何让我的功能终止。我尝试使用 n=0、while (n=0) 和 n++ 使其计算一次,但我觉得我完全错过了使用条件来控制递归函数在自身内部挖掘多少次这一点。我被困住了,有点沮丧,所以如果这根本没有意义,我深表歉意。

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


【解决方案1】:

我写了一个没有终止条件的简单递归示例。这个例子不会有任何结束。 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 就可以停止重新计算值。
  • 或者可能有其他公式,不取决于其他球的碰撞速度。

遗憾的是,我的物理知识太短,无法帮助您计算公式:(

【讨论】:

  • 好吧,collisionVelocity 是我创建的一个矢量对象,它基本上只有一个 x 和一个 y 分量。我试图让球在任何方向移动,如果它们发生碰撞,每个球的速度将根据计算刷新一次。我遇到的问题是,根据我使用的物理学(系统内的整体动量是守恒的事实),每个球的新速度取决于另一个球的新速度。所以我不知道如何让它以自己的快乐方式发送。有意义吗?
猜你喜欢
  • 1970-01-01
  • 2018-03-10
  • 2014-08-27
  • 2016-11-11
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 2012-08-20
  • 2016-12-30
相关资源
最近更新 更多