# For Loop collision

• 04-24-2012, 11:16 PM
lj81
For Loop collision
Hi I'm currently writing a program which applies collision detection to balls on the screen. My code works to a certain extent (the balls collide however they do not rebound away from each other) but it is not written efficiently.

Here is the code that partially works:

Code:

```private void checkForCollision(Ball b[]) {     double ballX = b[0].getX();     double ballY = b[0].getY();     double radiusb = Ball.getRadius();     double ball4X = b[4].getX();     double ball4Y = b[4].getY();     double radiusb4 = Ball.getRadius();     double ball5X = b[5].getX();     double ball5Y = b[5].getY();     double radiusb5 = Ball.getRadius();     double ball6X = b[6].getX();     double ball6Y = b[6].getY();     double radiusb6 = Ball.getRadius();     double a = ball5X - ballX;     double bb = ball5Y  - ballY;     double cc = ball4X - ballX;     double d = ball4Y - ballY;     double e = ball5X - ball4X;     double f = ball5Y - ball4Y;     double gg = ball6X - ballX;     double h = ball6Y - ballY;     double i = ball6X - ball4X;     double j = ball6Y - ball4Y;     double k = ball6X - ball5X;     double l = ball6Y - ball5Y;     double collide = radiusb4 + radiusb;     double collide1 = radiusb5 + radiusb;     double collide2 = radiusb5 + radiusb4;     double collide3 = radiusb6 + radiusb;     double collide4 = radiusb6 + radiusb4;     double collide5 = radiusb6 + radiusb5;     double c = Math.sqrt((double) (a * a) + (double) (bb * bb));     double c1 = Math.sqrt((double) (cc * cc) + (double) (d * d));     double c2 = Math.sqrt((double) (e * e) + (double) (f * f));     double c3 = Math.sqrt((double) (gg * gg) + (double) (h * h));     double c4 = Math.sqrt((double) (i * i) + (double) (j * j));     double c5 = Math.sqrt((double) (k * k) + (double) (l * l));         if (c < collide){             performAction(b[0], b[5]);         }         else if(c1 < collide1) {             performAction(b[0],b[4]);         }         else if(c2 < collide2) {             performAction(b[4], b[5]);         }         else if(c3 < collide3) {             performAction(b[6], b[0]);         }         else if(c4 < collide4) {             performAction(b[4], b[6]);         }         else if(c5 < collide5) {             performAction(b[6], b[5]);         }     }```
I know that this method should be written using a for loop to loop through each ball in turn and get the x and y values. The Ball.getRadius is a static method and and a comparison made with each other ball in subsequent slots of the array. I believe that this should be done using an outer and inner loop which eliminates the need to each ball with every other ball twice. I have made an attempt at it but I'm way off the mark I think so any help you could give me as to how it should be written would be greatly appreciated.

Here is my attempt:

Code:

``` for(int i = 0; i < b.length; i ++) {             b[i] = new Ball(b[i].getX(), b[i].getY(), b[i].getDeltaX(), b[i].getDeltaY());             Ball.getRadius();             for(int j = 0; j < b.length; j ++) {                 if(j != i) {                     double yPosDifference = b[j].getDeltaY() - b[i].getDeltaY();                     double xPosDifference = b[j].getDeltaX() - b[i].getDeltaX();                     double collide = b[j].getRadius() + b[i].getRadius();                     double centres = Math.sqrt((yPosDifference * yPosDifference) + (xPosDifference * xPosDifference));                     if (centres < collide){                         performAction(b[i], b[i]);                     }                 }                          }         }     }```
• 04-26-2012, 10:26 PM
kjkrum
Re: For Loop collision
Before you go any further, give your variables descriptive names. As it is, it's hard to even figure out what you're trying to do.
• 04-27-2012, 09:47 PM
lj81
Re: For Loop collision
Yeah thanks for that. Figured it out myself any way.