※フラクタルの次元などの理論的な小難しい話は割愛します(そもそも理解していない)。
1.Hフラクタルのプログラム
百聞は一見にしかず。とりあえず見てみればわかると思う。Hという文字が沢山くっついているのがわかると思う。一部を拡大すればまたHが出てきて,さらにそれを拡大すれば……となっている。
まぁプログラムはこちら。
/* stepを呼び出す関数 */
int N = 5;
void setup() {
size(512,512);
}
void draw() {
/* 背景を黒で塗りつぶす */
background(0);
/* 線の色を緑に指定 */
stroke(0,255,0);
/* 再帰関数を呼び出す */
step(width/2,height/2,0);
}
/**
* @fn
* H-フラクタルを描くプログラム
* @param (x) 'H'の文字の中心x座標
* @param (y) 'H'の文字の中心y座標
* @param (n) 呼び出された回数(深さ)
*/
void step(float x, float y, int n) {
if ( n >= N )
return;
/* Hの各辺の長さの半分の長さ */
float len = width / 4 * pow(0.5, n);
/* 中心の横棒を描く */
line(x-len, y, x+len, y);
/* 左の縦棒を描く */
line(x-len, y-len, x-len, y+len);
/* 右の縦棒を描く */
line(x+len, y-len, x+len, y+len);
/* Hの右上・右下・左上・左下の点から新たに'H'を描く */
step(x-len, y-len, n+1);
step(x-len, y+len, n+1);
step(x+len, y-len, n+1);
step(x+len, y+len, n+1);
}
再帰関数の練習にはなったかな。2.シェルピンスキーのふるいを描く
シェルピンスキーのギャスケットとも言うらしい。本の絵を見て作ったから間違ってるかもしれ無いけれど。図形はこんなの
プログラムはこんな感じ。
/* stepを呼び出す回数 */
int N = 7;
void setup() {
size(512, 512);
}
void draw() {
/* 背景を黒で塗りつぶす */
background(0);
/* 線の色を緑に指定 */
stroke(0, 255, 0);
/* 原点を中心に持ってくる */
translate(width/2, height/2);
/* 画面を適当な角度だけ回転する */
rotate(PI/6);
/* 再帰関数を呼び出す */
step(0, 0, 0);
}
/**
* @fn
* シェルピンスキーのふるいを描くプログラム
* @param (x) 三角形の中心x座標
* @param (y) 三角形の中心y座標
* @param (n) 呼び出された回数(深さ)
*/
void step(float x, float y, int n) {
if ( n >= N )
return;
float len = width / 3 * pow(0.5, n);
/* 3分の2 * PI [rad]つまり120度 */
float theta = 2.0/3.0*PI;
float x0, x1, y0, y1;
/* 三角形を描く */
for (int i = 0; i < 3; i++ ) {
x0 = x+len * cos( i * theta );
y0 = y+len * sin( i * theta );
x1 = x+len * cos( (i+1) * theta );
y1 = y+len * sin( (i+1) * theta );
line(x0, y0, x1, y1);
}
/* もう一つ小さい三角形の中心を指定し呼び出す */
len = len / 2;
for (int i = 0; i < 3; i++ ) {
step(x+len*cos(i*theta), y+len*sin(i*theta), n+1);
}
}
まぁsin,cosの勉強にはなったかな。
3.なんかよくわからないもの
なんかいい感じのやつがあったのであげておきます。ただ詳細はよくわからないです。L,Rの漸化式をランダムで計算するといい感じの図形が得られる。Lは原点中心の1/4回転を,Rは点(1,0)の拡大を行うとのこと。そうするといい感じのやつが描かれるという。
百聞は一見にしかず,だ。プログラムと画像はこんな感じ。プログラムを実行したらマウスを動かすと上の式のaが変化して図形が変化します。
int N = 4096;
void setup() {
size(512, 512);
}
void draw() {
/* 背景を黒で塗りつぶす */
background(0);
/* 線の色を緑に指定 */
stroke(0, 255, 0);
/* 原点を中心に持ってくる */
translate(width/2, height/2);
/* 画面を適当な角度だけ回転する */
rotate(PI);
float x = 0.0;
float y = 0.0;
float temp, tx, ty;
/* 定数aを適当に決める */
float a = 5.0*(mouseX * mouseY ) / ( width*height );
for (int i = 0; i < N; i++ ) {
/* x_n,y_nを保存しておく */
tx = x;
ty = y;
/* 漸化式をランダムに変える */
if ( random(2) < 1 ) {
x = -ty;
y = tx;
} else {
temp = (tx-1)*(tx-1)+ty*ty+1;
x = 1 + a * ( x - 1 ) / temp;
y = a * ty /temp;
}
/* 点の描画 */
rect(x*width/2, y*height/2, 1, 1);
}
}
何なんだろこれ。でも面白いからいいか.




0 件のコメント:
コメントを投稿