## Collision in 2D

This is an example of doing collision in 2D.

There are a bunch of balls that collide against each other and the edges of the screen.

To use it you would have to convert it to 3D. You will probably want to do most collision in the x and z axes and then do collisions with the floor (a constant y value?)

To collide against a box, just reverse the code for colliding against walls.

### The ball class

```      class Ball { // position PVector pos; // velocity PVector vel; // size (radius) float sz;   // constructor Ball(PVector p, PVector v, float s) { pos = p; vel = v; sz = s; }   // collision with the sides of the screen // h is the height w is the width void collideWalls(float h, float w) { // test the x-position // if it is less than 0 or greater than w it is off screen // and we need to do something // add and subtract sz to make sure you are // colliding the edges rather than the middle // of the ball if((pos.x - sz) < 0 || (pos.x + sz) > w) // if you have a collision you reverse the // velocity in the x direction vel.x = -vel.x; // do the same for y if((pos.y - sz) < 0 || (pos.y + sz) > h) vel.y = -vel.y; }   // collide against other balls void collideBalls(Ball balls[]) { for (int i = 0; i < balls.length; i++) { // check if the distance between the centres is less // than the sum of the sizes of the balls // if so you have a collision if(dist(pos.x, pos.y, balls[i].pos.x, balls[i].pos.y) < sz+ balls[i].sz) { // accelerate the ball away from the collision // that means along the line from the other ball // to the centre of this ball PVector acceleration = PVector.sub(pos, balls[i].pos); // get it proportional to the velocity // first normalise it acceleration.normalize(); // the dot product gets the velocity in the direction of // the acceleration float speed = acceleration.dot(vel); // set the acceleration to minus twice that speed // (to cancel out the existing velocity and // then add a negative speed) acceleration.mult(-2.0f*speed); // add it to the velocity vel.add(acceleration); } } }   void updatePos() { pos.add(vel); }   void draw() { ellipseMode (CENTER); strokeWeight(4); ellipse (pos.x, pos.y, sz, sz); }   }```

### The application

```    // an array of objects Ball balls[];     void setup() { size(800, 800); balls = new Ball;   // the size of the balls float sz = 10.0f; // create a bunch of balls with random positions and velocities for (int i = 0; i < balls.length; i++) { PVector pos = new PVector(random(sz, width-sz), random(sz, height-sz)); PVector vel = new PVector(random(-2, 2), random(-2, 2)); balls[i] = new Ball(pos, vel, sz); } }   void draw() { background(255);   // cycle through all the balls doing the operations for (int i = 0; i < balls.length; i++) { // colision with the edges of the screen balls[i].collideWalls(height, width); // collision with other balls balls[i].collideBalls(balls); // move the balls balls[i].updatePos(); // draw them balls[i].draw(); } }```