int ballNum = 5; // ball size float r; // position, velocity and angle float[] x, y, v, vang; // time step float ts = 0.5; void setup() { size(300,300); background(255); // white ellipseMode(RADIUS); r = 10; x = new float[ballNum]; y = new float[ballNum]; v = new float[ballNum]; vang = new float[ballNum]; for( int i = 0 ; i < ballNum ; i++ ) { x[i] = int(random(width - 2 * r) + r); y[i] = int(random(height - 2 * r) + r); v[i] = int(random(10) + 5); vang[i] = int(random(360)); } } void draw() { clearToWhite(); for( int i = 0 ; i < ballNum ; i++ ) { updatePosition(i); checkBounceX(i); checkBounceY(i); drawBall(x[i], y[i]); } } void clearToWhite() { fill(255,70); noStroke(); rect(0,0,width,height); } void checkBounceX(int i) { if( x[i] < r || width - r < x[i] ) { if( vang[i] < 180 ) { vang[i] = 90 - (vang[i] - 90); } else { vang[i] = 270 - (vang[i] - 270); } if( x[i] < r ) { x[i] = r; } else { x[i] = width - r; } } } void checkBounceY(int i) { if( y[i] < r || height - r < y[i] ) { if( 90 < vang[i] && vang[i] < 270 ) { vang[i] = 180 - (vang[i] - 180); } else { vang[i] = 360 - (vang[i] - 360); } if( y[i] < r ) { y[i] = r; } else { y[i] = height - r; } } } void updatePosition(int i) { float vx = v[i] * cos(radians(vang[i])); float vy = v[i] * -sin(radians(vang[i])); x[i] = x[i] + ts * vx; y[i] = y[i] + ts * vy; } void drawBall(float x, float y) { fill(255); stroke(0); ellipse(x, y, r, r); }