Ошибка рекурсии при получении переполнения стека с обнаружением коллизий

1

У меня есть класс шара, который имеет атрибуты положения, скорости и ускорения как атрибуты. Моя программа создает два объекта шара и перемещает их по гравитационной силе между ними.

У меня все отлично работает, но я пытаюсь реализовать функцию обнаружения столкновений, которая заставляет шары отскакивать друг от друга.

Вот метод, который обновляет скорость:

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

Я хочу, чтобы эта программа назначала новую скорость столкновения переменной скорости в каждом шаре. Когда я запускаю программу, шары движутся друг к другу в порядке. Однако, когда шары сталкиваются, они не отскакивают... они склеиваются в неподвижном положении, и я получаю ошибку. Я читал в другом месте, что это может иметь какое-то отношение к условию завершения, но я не знаю, что это значит. Есть идеи??

Большое спасибо за помощь!

Теги:
collision
game-physics
collision-detection
physics

1 ответ

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. И чем использовать эту расчетную скорость столкновения для вычисления другой скорости столкновения шарика и так далее. Вы можете заявить, что java может остановить пересчет значений, как только каждый пересчет приведет к изменению менее 0,01 (или аналогичных).
  • Или, может быть, есть другая формула, которая не зависит от скорости столкновения других шаров.

К сожалению, мои физические знания слишком коротки, чтобы помочь вам с вашими формулами :(

  • 0
    Ну, collisionVelocity - это векторный объект, который я создал, в котором просто есть компонент x и ay. Я пытаюсь сделать так, чтобы шары перемещались в любом направлении, и если они сталкиваются, скорости каждого шара будут обновляться один раз в соответствии с расчетом. Проблема, с которой я сталкиваюсь, заключается в том, что в соответствии с физикой, которую я использую (тот факт, что общий импульс внутри системы сохраняется), новые скорости каждого шара зависят от новых скоростей другого. Поэтому я не знаю, как заставить его отправлять каждого по-своему веселым путем. Есть смысл?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню