a port of the Processing Visualization Language

BouncyBubbles

Based on code from Keith Peters (www.bit-101.com). Multiple-object collision.

Original Processing.org Example: BouncyBubbles

// All Examples Written by Casey Reas and Ben Fry

// unless otherwise stated.

int numBalls = 12;

float spring = 0.05;

float gravity = 0.03;

Ball[] balls = new Ball[numBalls];



void setup() 

{

  size(200, 200);

  noStroke();

  smooth();

  for (int i = 0; i < numBalls; i++) {

    balls[i] = new Ball(random(width), random(height), random(20, 40), i, balls);

  }

}



void draw() 

{

  background(0);

  for (int i = 0; i < numBalls; i++) {

    balls[i].collide();

    balls[i].move();

    balls[i].display();  

  }

}



class Ball {

  float x, y;

  float diameter;

  float vx = 0;

  float vy = 0;

  int id;

  Ball[] others;

 

  Ball(float xin, float yin, float din, int idin, Ball[] oin) {

    x = xin;

    y = yin;

    diameter = din;

    id = idin;

    others = oin;

  } 

  

  void collide() {

    for (int i = id + 1; i < numBalls; i++) {

      float dx = others[i].x - x;

      float dy = others[i].y - y;

      float distance = sqrt(dx*dx + dy*dy);

      float minDist = others[i].diameter/2 + diameter/2;

      if (distance < minDist) { 

        float angle = atan2(dy, dx);

        float targetX = x + cos(angle) * minDist;

        float targetY = y + sin(angle) * minDist;

        float ax = (targetX - others[i].x) * spring;

        float ay = (targetY - others[i].y) * spring;

        vx -= ax;

        vy -= ay;

        others[i].vx += ax;

        others[i].vy += ay;

      }

    }   

  }

  

  void move() {

    vy += gravity;

    x += vx;

    y += vy;

    if (x + diameter/2 > width) {

      x = width - diameter/2;

      vx += -0.9; 

    }

    else if (x - diameter/2 < 0) {

      x = diameter/2;

      vx *= -0.9;

    }

    if (y + diameter/2 > height) {

      y = height - diameter/2;

      vy *= -0.9; 

    } 

    else if (y - diameter/2 < 0) {

      y = diameter/2;

      vy *= -0.9;

    }

  }

  

  void display() {

    fill(255, 204);

    ellipse(x, y, diameter, diameter);

  }

}
Fork me on GitHub