Daily Creative Coding

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

波打つ年輪

/**
* Waving Annual Growth Ring
*
* @author aa_debdeb
* @date 2016/02/09
*
*/

int LOOP_NUM = 40;
ArrayList<ArrayList<Vertex>> verticiesList;
float time;

void setup(){
  size(500, 500);
  frameRate(60);
  smooth();
  time = 0;
  
  verticiesList = new ArrayList<ArrayList<Vertex>>(); 
  float angle = 0.0;
  ArrayList<Vertex> verticies = new ArrayList<Vertex>();
  while(angle < 358){
    angle += map(random(1), 0, 1, 5, 10);
    verticies.add(new Vertex(0, angle));
  }
  verticiesList.add(verticies);
  for(int i = 0; i < LOOP_NUM - 1; i++){
    ArrayList<Vertex> preVerticies = verticiesList.get(i);
    ArrayList<Vertex> nextVerticies = new ArrayList<Vertex>();
    for(Vertex v: preVerticies){
      float r = v.getRadious(time);
      nextVerticies.add(new Vertex(r, v.angle));
    }
    verticiesList.add(nextVerticies);
  }
}

void draw(){
  float time = frameCount * 0.01;
  background(255);
  noFill();
  stroke(0);
  strokeWeight(1);
  translate(width / 2, height / 2);
  beginShape();
  for(Vertex v: verticiesList.get(0)){
    float radious = v.getRadious(time);
    curveVertex(radious * cos(radians(v.angle)), radious * sin(radians(v.angle)));
  }  
  for(int vi = 0; vi < 3; vi++){
    Vertex v = verticiesList.get(0).get(vi);
    float radious = v.getRadious(time);
    curveVertex(radious * cos(radians(v.angle)), radious * sin(radians(v.angle)));
  }
  endShape();
  for(int i = 0; i < LOOP_NUM - 1; i++){
    ArrayList<Vertex> preVerticies = verticiesList.get(i);
    ArrayList<Vertex> curVerticies = verticiesList.get(i + 1);
    beginShape();
    for(int vi = 0; vi < preVerticies.size(); vi++){
      Vertex preVertex = preVerticies.get(vi);
      Vertex curVertex = curVerticies.get(vi);
      curVertex.setPreRadious(preVertex.getRadious(time));
      float radious = curVertex.getRadious(time);
      curveVertex(radious * cos(radians(curVertex.angle)), radious * sin(radians(curVertex.angle)));
    }
    for(int vi = 0; vi < 3; vi++){
      Vertex v = curVerticies.get(vi);
      float radious = v.getRadious(time);
      curveVertex(radious * cos(radians(v.angle)), radious * sin(radians(v.angle)));
    }
    endShape();
  }
}

class Vertex{
  float preRadious;
  float angle;
  float gapNoise;
  
  Vertex(float preRadious, float angle){
    this.preRadious = preRadious;
    this.angle = angle;
    gapNoise = random(100);
  }
  
  void setPreRadious(float preRadious){
    this.preRadious = preRadious;
  }
  
  float getRadious(float time){
    return preRadious + map(noise(gapNoise + time), 0, 1, 3, 10);
  }
}