Daily Creative Coding

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

弧で歩く2

/**
* arc walkers 2
*
* @author aa_debdeb
* @date 2016/06/04
*/

ArrayList<Drawer> drawers;

void setup(){
  size(500, 500);
  background(255);
  colorMode(HSB, 360, 100, 100);
  drawers = new ArrayList<Drawer>();
  for(int i = 0; i < 100; i++){
    drawers.add(new Drawer());
  }
  noStroke();
}

void draw(){
  for(Drawer d: drawers){
    d.update();
  }
}

class Drawer{
  
  PVector pos;
  float radious, radian;
  float radianSpeed;
  color c;
  
  Drawer(){
    pos = new PVector(random(width), random(height));
    radious = random(30, 100);
    radian = random(TWO_PI);
    radianSpeed = random(PI / 128, PI / 64);
    c = color(random(360), 100, 100);
  }
  
  void update(){
    fill(c);
    if(radianSpeed > 0){
      arc(pos.x, pos.y, radious * 2, radious * 2, radian, radian + radianSpeed);
      arc(pos.x - width, pos.y, radious * 2, radious * 2, radian, radian + radianSpeed);
      arc(pos.x + width, pos.y, radious * 2, radious * 2, radian, radian + radianSpeed);
      arc(pos.x, pos.y - height, radious * 2, radious * 2, radian, radian + radianSpeed);
      arc(pos.x, pos.y + height, radious * 2, radious * 2, radian, radian + radianSpeed);
    } else {
      arc(pos.x, pos.y, radious * 2, radious * 2, radian + radianSpeed, radian);    
      arc(pos.x - width, pos.y, radious * 2, radious * 2, radian + radianSpeed, radian);    
      arc(pos.x + width, pos.y, radious * 2, radious * 2, radian + radianSpeed, radian);    
      arc(pos.x, pos.y - height, radious * 2, radious * 2, radian + radianSpeed, radian);    
      arc(pos.x, pos.y + height, radious * 2, radious * 2, radian + radianSpeed, radian);    
    }
    if(random(1) < 0.1){
      pos.x += radious * cos(radian);
      pos.y += radious * sin(radian);
      if(pos.x < 0){
        pos.x += width;
      }
      if(pos.x >= width){
        pos.x -= width;
      }
      if(pos.y < 0){
        pos.y += height;
      }
      if(pos.y >= height){
        pos.y -= height;
      }
      radianSpeed *= -1;
      radian += PI;
    } else {
      radian += radianSpeed;
    }
    if(radian < 0){
      radian += TWO_PI;
    }
    if(radian >= TWO_PI){
      radian -= TWO_PI;
    }
  }

}