【Processing】リサージュ曲線を描画に使う(2)〜ellipse2()をつくる〜

ここ最近、三角関数とコードについて考えることがあった。
リサージュ曲線を見てると、やっぱり数値の振る舞いはきれいだよな〜と思う。

ところで、リサージュ曲線を書きたいとき、いちいち計算しないといけないのがめんどくさくて、
ellipse()で設定できたら楽なのにな〜〜〜と思った。

なので関数を作った。けっこうめんどくさかったが、できてよかった。
で、作ってどうするの?ってのが問題。
使わない道具は存在する意味がないので、どうにか使いみちを考えてみる。
だれかつかってみてほしい。


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

void draw() {
  background(250);

  int grid = (int)((random(30)+1));
  float disX =(width/(grid*2));
  float disY =(height/(grid*2));

  for (int i = 0; i < grid+1; i++) {
    for (int j = 0; j < grid+1; j++) {
      color strokeColor = color(155);
      color fillColor = color(random(250), 0, 200, random(80));
     //引数は(座標x,座標y,半径、リサージュ図形のための係数X,リサージュ図形のための係数Y,先の配色、塗の配色);
      ellipse2(disX + 2*disX*i, disY + 2*disY*j, ((disX+ disY)/2)-1, 
        (int)random(5), (int)random(5), 
        strokeColor, fillColor);
    }
  }
}


//リサージュ設定付きのellipse()-------
void ellipse2(float x, float y, 
  float radius, 
  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 = radius*cos(radians(degree*risaX));
    ry = radius*sin(radians(degree*risaY));       
    prx = radius*cos(radians((-1 + degree)*risaX));
    pry = radius*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 = radius*cos(radians(degree*risaX));
    ry = radius*sin(radians(degree*risaY));       
    prx = radius*cos(radians((-1 + degree)*risaX));
    pry = radius*sin(radians((-1+ degree)*risaY)); 
    noFill();
    strokeWeight(0.5);
    stroke(st);
    line(prx, pry, rx, ry);
  }
  popMatrix();
  
  save("save/" + frameCount + ".jpg");
}