Processing Advent Calendar 2013 参加記事
1114122922
Super_Rose_Curve- OpenProcessing

Processingでスーパーバラ曲線を描いてみました。
スーパーバラ曲線とは、通常のバラ曲線よりも複雑な模様を描ける曲線のことのようです。
元ネタと詳しい解説はこちらから見ることができます。
数学ってアート!方程式で描くゴージャスな「バラ曲線」で大魔神を描いてみた : カラパイア

Processingで描く手順
Processingの座標は原点(0,0)が左上にあるようになっています。
これをtranslate(width/2,height/2)すると中心に原点がとれるのできれいに描けるようになります。
void setup() {
size(400, 400);
colorMode(HSB, 360, 100, 100);
background(0);
smooth();
noLoop();
noStroke();
}

void draw() {
background(0);

pushMatrix();
translate(width/2, height/2);

popMatrix();
}

では、上のリンク先からダウンロードできる資料「スーパーバラ曲線を作ろう」から、
「中心から浮かせる」曲線について描いていきたいと思います。
資料の式を参考に、適当な数の円を曲線上に配置していきます。
この時、xとyに適当な大きさの変数curve_r をかけておきます。
これは曲線自体の大きさを調整するための値です。
int num = 5000;

float x;
float y;
float a;
float r1 = 0;
float t1 = 0.1;
float r2 = 0;
float t2 = 1.0;
float h2 = 0.5;

int curve_r = 100;
int dot_r = 10;

void setup() {
size(400, 400);
colorMode(HSB, 360, 100, 100);
background(0);
smooth();
noStroke();
noLoop();
}

void draw() {
background(0);

pushMatrix();
translate(width/2, height/2);

for (int i = 0;i < num;i++) {
a = sin(r2) * h2 + 1;
x = curve_r * a * sin(r1);
y = curve_r * a * cos(r1);

r1 += t1;
r2 += t2;

fill(360, 10);
ellipse(x, y, dot_r, dot_r);
}

popMatrix();
}
1121152334
これに色をつけていきます。
今回は、ループ回数が適当な数の倍数(今回は5)になった時だけ有彩色にし、
それ以外は白で描いてみました。
また、白い円はサイズも小さくしてみました。
void draw() {
background(0);

pushMatrix();
translate(width/2, height/2);

for (int i = 0;i < num;i++) {
a = sin(r2) * h2 + 1;
x = curve_r * a * sin(r1);
y = curve_r * a * cos(r1);

r1 += t1;
r2 += t2;

if (i % 5 == 0) {
dot_r = 20;
fill(20, 100, 100, 10);
}
else {
dot_r = 5;
fill(360, 10);
}

ellipse(x, y, dot_r, dot_r);
}

popMatrix();
}
1121183614
こんな感じになりました。


さて、資料の「波を足す」の項から、桜の形の曲線を描いてみました。
1121190549
そのまま描くと、このように傾いた桜になってしまいます。
これは-90度傾ける(左へ90度傾ける)ことによって補正できます。
つまり、rotate(radians(-90))することで見慣れた桜の形にすることができます。
int num = 5000;

float x;
float y;
float a;
float b;
float r1 = 0;
float t1 = 0.2;
float r2 = 0;
float t2 = 1.0;
float h2 = 0.5;

int curve_r = 100;
int dot_r = 10;

void setup() {
size(400, 400);
colorMode(HSB, 360, 100, 100);
background(0);
smooth();
noStroke();
noLoop();
}

void draw() {
background(0);

pushMatrix();
translate(width/2, height/2);
rotate(radians(-90)); //傾きの補正

for (int i = 0;i < num;i++) {
b = (sin(r2) + cos(r2 * 2)) / 2;
a = b * h2 + 1;
x = curve_r * a * sin(r1);
y = curve_r * a * cos(r1);

r1 += t1;
r2 += t2;

if (i % 5 == 0) {
dot_r = 20;
fill(310, 80, 100, 10);
}
else {
dot_r = 5;
fill(360, 10);
}

ellipse(x, y, dot_r, dot_r);
}

popMatrix();
}
1121190929
これで傾きを補正することができました。


スーパーバラ曲線は偶然の中から美しいパターンを発見するのが楽しい曲線です。
Processingなら簡単にその発見をすることができます。
みなさんも、スーパーバラ曲線で遊んでみてはいかがでしょうか。
最後に、私がつくったスーパーバラ曲線を下に展示しておこうと思います。
1114122647
1114122803
1114122859
1114123056
1114123154
1114123321
1114132925
1114132950
1114132837