フィボナッチ数列
提供:kuhalaboWiki
(版間での差分)
(→リンク) |
|||
97行: | 97行: | ||
== リンク == | == リンク == | ||
+ | |||
+ | [[矩形分割]] | ||
+ | |||
+ | [[らせん]] | ||
[[スケーラブルアート論]] | [[スケーラブルアート論]] | ||
[[Category:授業]] | [[Category:授業]] |
2021年9月24日 (金) 03:02時点における最新版
- f(0) = 0, f(1) = 1, f(n) = f(n-1) + f(n-2)
- 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, …
int num = 40; int[] fibo = {0,1}; // Initial Fibonacci int i = 0; println(i, ":", fibo[i]); for(i = 1; i < num; i++){ println(i, ":", fibo[i]); fibo = append(fibo, fibo[i-1] + fibo[i]); }
- append 動的配列の要素を追加する
[編集] フィボナッチ数列の可視化
フィボナッチ数を1辺とする正方形を敷き詰めて、長方形を描く。
int[] fibo = {0,1,1}; int[] SGN = {-1, 1, 1, -1}; //敷き詰める方向を決める符号 void setup(){ size(500, 500); colorMode(HSB, 1); drawSpiral(); }
void drawSpiral(){ float xPos = 0; float yPos = 0; float scalar = (float) width / (2 * fibo[fibo.length - 1]); //拡大・縮小比率 background(0, 0, 1); translate(width / 2 ,height / 2); //描画ウィンドウ中央に移動 for(int i = 1; i < fibo.length - 1; i++){ fill((0.1 * i) % 1, 1, 1); //正方形を描く方向を符号の配列に従って変える rect(scalar * xPos, scalar * yPos, scalar * SGN[(i+1) % 4] * fibo[i], //符号が負の場合,逆方向に正方形を描画 scalar * SGN[i % 4] * fibo[i]); //正方形の位置を符号の配列に従って変える if (i % 2 == 1){ xPos += SGN[i % 4] * (fibo[i] + fibo[i + 1]); } else { yPos += SGN[i % 4] * (fibo[i] + fibo[i + 1]); } } }
- translate 座標を平行移動する。上記の場合は、座標の原点を画面の左上から中央に移動している。
void mouseClicked() { int nextFibo = fibo[fibo.length-2] + fibo[fibo.length-1]; fibo = append(fibo, nextFibo); drawSpiral(); println(nextFibo); } void draw(){}
フィボナッチらせんを描く関数
void drawSpiral(){ float xPos = 0; float yPos = 0; float scalar = (float) width / (2 * fibo[fibo.length-1]); //拡大・縮小比率 background(0, 0, 1); translate(width / 2 ,height / 2); //描画ウィンドウ中央に移動 for(int i = 1; i < fibo.length - 1; i++){ stroke(0, 0, 0); rect(scalar * xPos, scalar * yPos, scalar * SGN[(i+1) % 4] * fibo[i], scalar * SGN[i % 4] * fibo[i]); stroke(0, 1, 1); arc(scalar * (xPos + SGN[(i+1) % 4] * fibo[i]), //円の中心のx座標 scalar * (yPos + SGN[i % 4] * fibo[i]), //円の中心のy座標 scalar * 2 * fibo[i], //楕円の縦の直径 scalar * 2 * fibo[i], //楕円の横の直径(正円のため縦と同じ) (1 + i) * PI / 2, //円弧の開始位置(ラジアン) (2 + i) * PI / 2); //円弧の終了位置 if (i % 2 == 1){ xPos += SGN[i % 4] * (fibo[i] + fibo[i+1]); } else { yPos += SGN[i % 4] * (fibo[i] + fibo[i+1]); } } }