У меня есть класс шара, который имеет атрибуты положения, скорости и ускорения как атрибуты. Моя программа создает два объекта шара и перемещает их по гравитационной силе между ними.
У меня все отлично работает, но я пытаюсь реализовать функцию обнаружения столкновений, которая заставляет шары отскакивать друг от друга.
Вот метод, который обновляет скорость:
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);
}
Я хочу, чтобы эта программа назначала новую скорость столкновения переменной скорости в каждом шаре. Когда я запускаю программу, шары движутся друг к другу в порядке. Однако, когда шары сталкиваются, они не отскакивают... они склеиваются в неподвижном положении, и я получаю ошибку. Я читал в другом месте, что это может иметь какое-то отношение к условию завершения, но я не знаю, что это значит. Есть идеи??
Большое спасибо за помощь!
Я написал простой пример рекурсии без условия завершения. Этот пример не найдет конца. 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);
}
}
К вашему конкретному случаю:
Некоторые общие способы построения обходных путей для таких проблем:
К сожалению, мои физические знания слишком коротки, чтобы помочь вам с вашими формулами :(