> show canvas only <


/* 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;
    } 
        
}