Daily Creative Coding

元「30 min. Processing」。毎日、Creative Codingします。

伸び縮みする弧

/**
* elastic arcs
*
* @author aa_debdeb
* @date 2016/04/27
*/

ArrayList<Arc> arcs = new ArrayList<Arc>();

void setup(){
  size(500, 500);
  arcs = new ArrayList<Arc>();  
  for(int i = 0; i < 10; i++){
    arcs.add(new Arc());
  }
}

void draw(){
  colorMode(RGB, 255);
  background(32);
  translate(width / 2, height / 2);
  ArrayList<Arc> nextArcs = new ArrayList<Arc>();
  for(Arc a: arcs){
    a.update();
    a.display(); 
    if(!a.isDiappeared()){
      nextArcs.add(a);
    }
  }
  arcs = nextArcs;
  if(random(1) < 0.15){
    arcs.add(new Arc());
  }
}

class Arc{
  float ang1, ang2, end1, end2;
  boolean clockwise;
  float diameter;
  float hue, sat, bri;
  
  Arc(){
    end1 = random(TWO_PI);
    end2 = end1 + random(TWO_PI);
    ang1 = ang2 = end1;
    diameter = random(20, height);
    clockwise = random(1) < 0.5 ? true: false;
    hue = random(40, 120);
    sat = random(40, 100);
    bri = random(40, 100);
  }
  
  void update(){
    if(ang2 != end2){
      ang2 += PI / 64;
      if(ang2 >= end2){
        ang2 = end2;
      }
    } else if(ang1 != end2){
      ang1 += PI / 64;
      if(ang1 >= end2){
        ang1 = end2;
      }
    }
  }
  
  void display(){
    colorMode(HSB, 360, 100, 100);
    stroke(hue, sat, bri, 255);
    strokeWeight(3);
    noFill();
    if(clockwise){
      arc(0, 0, diameter, diameter, ang1, ang2);
    } else {
      if(ang2 != end2){
        arc(0, 0, diameter, diameter, ang1 - (ang2 - ang1), ang1);
      } else {
        arc(0, 0, diameter, diameter, end1 - (end2 - end1), end1 - (end2 - end1) + (ang2 - ang1));
      }
    }
  }
  
  boolean isDiappeared(){
    return ang1 == end2 && ang2 == end2;
  }
}