【Processing】リサージュ曲線を描画に使う(4)〜ellipse2()をまわしてみた〜



巻き貝ぽい。

float a = 360;
float b = random(1,1.5);
float c = random(255);

void setup() {
  size(800, 800);
  background(250);
}

void draw() {
  pushMatrix();
  translate(width/3, height/2);
  rotate(radians(a*b));

  a -= 0.5;

  color strokeColor =color(random(c*b),a, a*b);
  color fillColor = color(500 - a, random(250*b), c, width - a);

  ellipse2(a, 0, 
    a, a/(6*b), 
    1, (int)11, 
    strokeColor, fillColor);

  popMatrix();

  if (a < 0) {
    save("save/save.jpg");
    stop();
  }
}


//リサージュ設定付きのellipse()-------
void ellipse2(float x, float y, 
  float radiusX, float radiusY, 
  int risaX, int risaY, 
  color st, 
  color fi) {
  int degree = 0;
  float rx, ry;
  float prx, pry ;

  if (risaX%2 == 0) {
    //risaX++;
  } //奇数にする
  if (risaY%2 == 0) {
    //risaY++;
  } //奇数にする

  pushMatrix();
  translate(x, y);

  for (int i = 0; i < 360; i++) {
    degree = i;

    rx = radiusX*cos(radians(degree*risaX));
    ry = radiusY*sin(radians(degree*risaY));       
    prx = radiusX*cos(radians((-1 + degree)*risaX));
    pry = radiusY*sin(radians((-1+ degree)*risaY)); 

    noStroke();  
    fill(fi);
    beginShape();

    if (  risaX <=  risaY ) {
      vertex(0, 0);
      vertex(prx, 0); 
      vertex(prx, pry);  
      vertex(rx, ry);
      vertex(rx, 0); 
      vertex(0, 0);
    } else {
      vertex(0, 0);
      vertex(0, pry); 
      vertex(prx, pry);  
      vertex(rx, ry);
      vertex(0, ry); 
      vertex(0, 0);
    }
    endShape(CLOSE);
  }

  for (int i = 0; i < 360; i++) {
    degree = i;

    rx = radiusX*cos(radians(degree*risaX));
    ry = radiusY*sin(radians(degree*risaY));       
    prx = radiusX*cos(radians((-1 + degree)*risaX));
    pry = radiusY*sin(radians((-1+ degree)*risaY)); 
    noFill();
    strokeWeight(0.1);
    stroke(st);
    line(prx, pry, rx, ry);
  }
  popMatrix();

}