【Processing】リサージュ曲線を描画に使う(3)〜ellipse2()をならべてみた〜

94.hatenadiary.jp


続き。


https://twitter.com


せっかく関数を作ったので、使ってみた。
とりあえずならべてみた。
縦横比を調整できるようにしたけどその機能は使わなかった。

二重のfor文で、XとYのリサージュ曲線の係数に使う。
列と行でリサージュ曲線がどうなるか見れる。


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

void draw() {
  background(250);

  int grid = (int)(frameCount)*2;
  int disX =(width/(grid*2));
  int disY =(height/(grid*2));

  for (int i = 0; i < grid; i++) {
    for (int j = 0; j < grid; j++) {

      color strokeColor = color(250);
      color fillColor = color(100, random(250), 230, random(10,30));

      ellipse2((disX + 2*disX*i), (disY + 2*disY*j), 
        (disX)-1/grid, (disY)-1/grid, 
        i *2, j * 2, 
        strokeColor, fillColor);
    }
  }
}


//リサージュ設定付きの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(1);
    stroke(st);
    line(prx, pry, rx, ry);
  }
  popMatrix();

  save("save/" + frameCount + ".jpg");
}