我有一个球类,它有位置,速度和加速度矢量作为属性。我的程序实例化两个球对象并根据它们之间的重力移动它们。
我的一切都运转良好,但我正在尝试实现一种碰撞检测功能,使球体彼此反弹。
以下是更新速度的方法:
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);
}
我希望这个程序将新的碰撞速度分配给每个球中的速度变量。当我运行程序时,球很好地相互移动。然而,当球碰撞时,它们不会反弹......它们在一个固定位置粘在一起,我得到一个堆栈溢出错误。我在别处读到这可能与终止条件有关,但我不知道这意味着什么。任何想法??
非常感谢您的帮助!
答案 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);
}
}
根据您的具体情况:
为此类问题构建变通方法的一些常用方法:
可悲的是,我的物理知识太短,无法帮助你解决公式:(