/* built with Studio Sketchpad:
* https://sketchpad.cc
*
* observe the evolution of this sketch:
* https://studio.sketchpad.cc/sp/pad/view/ro.sZVYxgS-gkC/rev.860
*
* authors:
* Andrzej Koper
* license (unless otherwise specified):
* creative commons attribution-share alike 3.0 license.
* https://creativecommons.org/licenses/by-sa/3.0/
*/
////////////////////////////////////////////////////////////////////////////
// CircleSeq
// by: Andrzej Koper
// http://1000abstractmachines.pl
////////////////////////////////////////////////////////////////////////////
Rings[] rings;
int numRings = 32;
int currentRing = 0;
void setup() {
size (400,300);
smooth();
rings = new Ring[numRings];
for (int i = 0; i < numRings; i++) {
rings[i] = new Ring();
//rings[i].start(random(400),random(300));
}
}
void draw() {
background(255);
for (int i = 0; i < rings.length; i++) {
for (int j = 0 ; j < rings.length; j++) {
float X2 = rings[i].getX();
float Y2 = rings[i].getY();
float R2 = rings[i].getDiameter();
float X1 = rings[j].getX();
float Y1 = rings[j].getY();
float R1 = rings[j].getDiameter();
float distCenters = dist(X2,Y2,X1,Y1);
float halfSumRadius = (R1 + R2) / 2;
if (halfSumRadius >= distCenters && distCenters != 0 ) {
rings[i].switchDir();
rings[j].switchDir();
}
}
rings[i].grow();
rings[i].display();
}
}
void mousePressed() {
rings[currentRing].start(mouseX, mouseY);
currentRing++;
if (currentRing >= numRings) {
currentRing = 0;
}
}
void keyPressed() {
setup();
}
///////////////////////////////////////
class Ring {
float x,y;
float diameter;
float speed;
void start(float xpos, float ypos) {
x=xpos;
y=ypos;
diameter = 0;
speed = 0.5;
}
void grow() {
if (diameter < 0){
this.switchDir();
}
diameter +=speed;
}
void display() {
fill (50,200,80,100);
strokeWeight(1);
stroke(0,100);
ellipse(x,y,diameter,diameter);
}
void switchDir() {
speed = -speed;
}
float getX() {
return x;
}
void setX(float tX) {
this.x = tX;
}
float getY() {
return y;
}
void setY(float tY) {
this.x = tY;
}
float getDiameter() {
return diameter;
}
void setDiameter(float tempDiameter) {
this.diameter = tempDiameter;
}
}