/* built with Studio Sketchpad:
* https://sketchpad.cc
*
* observe the evolution of this sketch:
* https://studio.sketchpad.cc/sp/pad/view/ro.x-kDyRWoY9j/rev.16
*
* authors:
* GoToLoop
* license (unless otherwise specified):
* creative commons attribution-share alike 3.0 license.
* https://creativecommons.org/licenses/by-sa/3.0/
*/
// http://forum.processing.org/topic/bouncing-ball-app-can-anyone-help-me-implement-vectors
// http://forum.processing.org/topic/collision-detection-29-4-2013
// http://studio.processingtogether.com/sp/pad/export/ro.91xkuWl51J$Vp/latest
final static short NUM_BALLS = 4, DIM = 0200, FPS = 50;
final static Ball[] balls = new Ball[NUM_BALLS];
final static String ENGINE = P2D; // use JAVA2D on Processing 2+
void setup() {
size (800, 600, ENGINE);
frameRate(FPS);
smooth();
noCursor();
noStroke();
fill(Ball.COLOUR);
balls[0] = new Ball(DIM >> 1, 0);
for ( int i=1; i!=NUM_BALLS; balls[i] = new Ball(DIM, i++) );
}
void draw() {
background(0);
for (Ball b: balls) b.script();
}
final class Ball {
float x, y, vx, vy;
final int diam, rad, id;
final static float SPRING = .2, FRICTION = -.4;
final static color TRANSLUCENT = 0xCC << 030;
final static color COLOUR = 0xFFFFFF | TRANSLUCENT;
Ball(int d, int ident) {
diam = d;
rad = d >> 1;
id = ident;
}
void script() {
update();
collide();
display();
}
void display() {
ellipse(x, y, diam, diam);
}
void collide() {
int i = id;
while (++i != NUM_BALLS) {
final Ball b = balls[i];
final float xx = b.x, yy = b.y;
final float dx = xx - x, dy = yy - y;
final float distance = sqrt(dx*dx + dy*dy);
final float minDist = b.rad + rad;
if (distance >= minDist) continue;
final float ang = atan2(dy, dx);
final float tx = x + cos(ang)*minDist;
final float ty = y + sin(ang)*minDist;
final float ax = (tx - xx)*SPRING, ay = (ty - yy)*SPRING;
vx -= ax;
vy -= ay;
b.vx += ax;
b.vy += ay;
}
}
void update() {
if (id == 0) {
x = mouseX;
y = mouseY;
return;
}
if ( (x += vx) + rad > width ) {
x = width - rad;
vx *= FRICTION;
}
else if (x - rad < 0) {
x = rad;
vx *= FRICTION;
}
if ( (y += vy) + rad > height ) {
y = height - rad;
vy *= FRICTION;
}
else if (y - rad < 0) {
y = rad;
vy *= FRICTION;
}
}
}