2012-05-11 5 views
0

У меня есть метод, который отражает шары от стены, а также друг от друга. Радиус каждого шара равен 50.Столкновение между шарами

public void reflectBalls(){ 
    for(int j = 0; j < 2; j++){ 
     if(ball[j].getY() <= NWall) ball[j].flipVertical(); 
     else if(ball[j].getY() >= (SWall - 50)) ball[j].flipVertical(); 
     else if(ball[j].getX() <= WWall) ball[j].flipHorizontal(); 
     else if(ball[j].getX() >= (EWall - 50)) ball[j].flipHorizontal(); 
    } 
    for(int i = 0; i < 2; i++){ 
     for(int j = 0; j < 2; j++){ 
      if(i == j){ 
       continue; 
      }else{ 
       double ax = (double)ball[i].getX(); 
       double ay = (double)ball[i].getY(); 
       double bx = (double)ball[j].getX(); 
       double by = (double)ball[j].getY(); 
       double distx = (ax-bx)*(ax-bx); 
       double disty = (ay-by)*(ay-by); 
       double distance = Math.sqrt(distx + disty); 
       if(Math.floor(distance) <= 100){ 
        ball[i].flipHorizontal(); 
        ball[j].flipVertical(); 
        ball[i].flipVertical(); 
        ball[j].flipHorizontal(); 
       } 
      } 
     } 
    } 
} 

Первая часть (отражение от стен) работает отлично. Однако шары не сталкиваются; они просто проходят друг через друга. Я пробовал много разных способов, но, возможно, есть какая-то математика, которую мне не хватает. Мой алгоритм работает на основе теоремы Пифагора, где разность между координатами X и разностью между координатами Y квадратична, а их сумма - это расстояние между центрами.

ответ

1

В этом ваша проблема - вы обнаружите, что мяч i сталкивается с мячом j, и вы переворачиваете его. Затем вы обнаружите, что шар j сталкивается с мячом i и снова переворачивает их. В результате никакого столкновения не происходит. Выполняйте только проверку столкновения, если j> i и все должно быть хорошо.

+0

В этом была проблема. Шарики не сталкиваются в нужное время, но это, скорее всего, математическая ошибка с моей стороны. – nh0815

1

Вы, вероятно, просто переверните дважды, потому что ваша петля обнаружит каждое столкновение дважды.

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

Как быстро исправить, вы можете изменить

for(int j = i+1; j < 2; j++){ 

Обратите внимание на i+1. Это «каждый позже шар».

Смежные вопросы