/* built with Studio Sketchpad:
* https://sketchpad.cc
*
* observe the evolution of this sketch:
* https://studio.sketchpad.cc/sp/pad/view/ro.dZQhYMb4SZe/rev.20
*
* authors:
* GoToLoop
* license (unless otherwise specified):
* creative commons attribution-share alike 3.0 license.
* https://creativecommons.org/licenses/by-sa/3.0/
*/
/**
* Wave Trios (v1.40)
* by GoToLoop (2014/Jun)
* for Costi6
*
* forum.Processing.org/two/discussion/5615/
* coding-noob-needs-help-how-do-i-draw-an-expanding-circle-
* that-triggers-with-a-mouse-click
*
* studio.ProcessingTogether.com/sp/pad/export/ro.9lTJ6qSlmCidk/latest
*/
static final boolean ONLINE = 1/2 == 1/2.;
static final short DIAM = 050, GROWTH = 6;
static final short FPS = 60, QUALITY = 0;
static final color BG = #BAE5FF;
import java.util.List;
final List<WaveTrio> trios = new ArrayList();
void setup() {
size(600, 600);
frameRate(FPS);
smooth(QUALITY);
ellipseMode(CENTER);
noFill();
stroke(Wave.OUTLINE);
strokeWeight(Wave.WEIGHT);
}
void draw() {
background(BG);
for (int len = trios.size(), i = len; i-- != 0; )
if (trios.get(i).script()) {
trios.set(i, trios.get(--len));
trios.remove(len);
}
if (!ONLINE) frame.setTitle("Wave Trios: #" + nf(trios.size(), 2)
+ "\t\tFrame Rate: #" + round(frameRate));
}
void mousePressed() {
trios.add(new WaveTrio(mouseX, mouseY, DIAM, ceil(random(1, GROWTH))));
}
class WaveTrio {
final List<Wave> waves =
ONLINE? new ArrayList() : new ArrayList(3);
WaveTrio(int x, int y, int d, int e) {
for (int i = 0; i != 3; waves.add(new Wave(x, y, d << i++, e)));
}
boolean script() {
for (int i = waves.size(); i-- != 0; )
if (waves.get(i).script()) waves.remove(i);
return waves.size() == 0;
}
}
class Wave {
static final color OUTLINE = #10A0FA;
static final float WEIGHT = 2.0, LIMIT = 1.3;
final short x, y; // coords. (x & y)
short d; // diameter
final short e; // expansion
Wave(int xx, int yy, int dd, int ee) {
x = (short) xx;
y = (short) yy;
d = (short) dd;
e = (short) ee;
}
boolean script() {
update();
display();
return gotTooBig();
}
void update() {
d += e;
}
void display() {
ellipse(x, y, d, d);
}
boolean gotTooBig() {
return d > width*LIMIT;
}
}