/* built with Studio Sketchpad:
* https://sketchpad.cc
*
* observe the evolution of this sketch:
* https://studio.sketchpad.cc/sp/pad/view/ro.lYj24nXOgk8/rev.19
*
* authors:
* GoToLoop
* license (unless otherwise specified):
* creative commons attribution-share alike 3.0 license.
* https://creativecommons.org/licenses/by-sa/3.0/
*/
/**
* Linked Balls (v3.2)
* by NatashaGunaratna (2014/Feb)
* mod Quark & GoToLoop
*
* forum.processing.org/two/discussion/3087/
* how-to-draw-lines-between-my-circles-where-they-overlap
*
* studio.processingtogether.com/sp/pad/export/ro.989GaZC5t7EkE/latest
*/
static final int QUALITY = 2, FPS = 60, BG = -1;
static final int NUM = 0100, MIN = 020, MAX = 0100;
final Bubble[] balls = new Bubble[NUM];
static final String ENGINE = JAVA2D;
//static final String ENGINE = P2D;
boolean isLooping = true;
void setup() {
size(800, 600, ENGINE);
frameRate(FPS);
smooth(QUALITY);
noFill();
stroke(Bubble.STROKE);
strokeWeight(Bubble.WEIGHT);
ellipseMode(CENTER);
online = 1/2 == 1/2.;
for ( int i = 0; i != NUM; balls[i++] = new Bubble(
random(MAX>>1, width - MAX), random(MAX>>1, height>>1),
(int) random(MIN, MAX)) );
}
void draw() {
background(BG);
if (!online) frame.setTitle("FPS: " + round(frameRate));
for (int j, i = 0; i != NUM; stroke(Bubble.STROKE)) {
Bubble p, b = balls[j = i++].script();
stroke(Bubble.LINK);
while (++j != NUM)
if (b.isIntersecting(p = balls[j])) b.linkToBubble(p);
}
}
void mousePressed() {
if (isLooping ^= true) loop();
else noLoop();
}
void keyPressed() {
mousePressed();
}
class Bubble {
static final color LINK = #FF4040, STROKE = 0;
static final float GRAV = .15, WEIGHT = 2.;
float x, y;
final short d, r;
float sx = random(.3, 1.5), sy = random(.1, .5);
Bubble(float xx, float yy, int dd) {
x = xx;
y = yy;
d = (short) dd;
r = (short) (dd>>1);
}
Bubble script() {
move();
bounce();
gravity();
display();
return this;
}
void move() {
x += sx;
y += sy;
}
void bounce() {
if (x > width - r | x < r) {
sx *= -1.;
move();
}
if (y > height - r | y < r) {
sy *= -1.;
move();
}
}
void gravity() {
sy += GRAV;
}
void display() {
ellipse(x, y, d, d);
}
void linkToBubble(Bubble b) {
line(x, y, b.x, b.y);
}
boolean isIntersecting(Bubble b) {
return sq(b.x - x) + sq(b.y - y) < sq(b.r + r);
}
}