Daily Creative Coding

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

球を囲む輪

/**
* rings on sphere
* 
* @author aa_debdeb
* @date 2016/06/08
*/

float radious = 200;
ArrayList<Ring> rings;

void setup(){
  size(500, 500, P3D);
  rings = new ArrayList<Ring>();
  noFill();
  strokeWeight(5);
  stroke(0, 206, 209);
}

void draw(){
  background(30);
  ArrayList<Ring> nextRings = new ArrayList<Ring>();
  translate(width / 2, height / 2, -100);
  rotateZ(map(mouseX, 0, width, -PI / 6, PI / 6));
  rotateX(map(mouseY, 0, height, -PI / 6, PI / 6));
  for(Ring ring: rings){
    ring.display();
    ring.update();
    if(ring.y < radious){
      nextRings.add(ring);
    }
  }
  rings = nextRings;
  if(frameCount % 10 == 1){
    rings.add(new Ring());
  }
}

class Ring{
  
  float y;
  
  Ring(){
    y = -radious;
  }
  
  void display(){
    pushMatrix();
    translate(0, y, 0);
    rotateX(PI / 2);
    float r = radious * cos(asin(abs(y / radious)));
    ellipse(0, 0, r * 2, r * 2);
    popMatrix();
  }
  
  void update(){
   y += 3.0;
  }
}