2015年10月21日水曜日

黄金比でひまわりの種の配列を描く[Processing]

 現状すべての記事に「プログラミング」タグが付いていることに困惑を隠せない今日この頃です。

 今日は黄金比やフィボナッチ数列の紹介でよく見るこの図形を描きます。


 この図形よく見かけるけれど描き方が今まで全くわからんかったのです。某専門学校に行ってる友人が授業で出されたというソースコードを見て知りました。今日はこれを紹介します。

1.描き方


 描き方は簡単。点を222.5°ずつ回転させながら打っていくだけ。
極座標表示するならこんな感じ。kを整数とし,θ0 = 222.5°としたとき,
という感じになる。この辺りで「黄金比使ってないやんけ!」という突っ込みが来そうだ。だが実は222.5という数字の中に隠されている。ちょっとここで222.5に黄金比φ=1.618...を掛けてみると,

222.5 × 1.618 = 360.005

 360という数字は一周の角度360°のことです。つまり222.5という数字は360÷(黄金比)の値だったのです。 さらにここでラジアン表記してみるとθ0は次のように表されます。
円周率と黄金比のイリュージョンやぁぁぁ!と叫びたくなりますね。非常に美しいですね。それと同時になぜ円周率を2πと定義しなかったのかというあの話を思い出しますね。

2.ソースコード


 Processingではラジアンでsin,cosは定義されているのでラジアンで計算しています。
/* 黄金比 */
float golden_ratio = (sqrt(5)-1.0)/2.0;

void setup() {
  /* 適当な大きさでウィンドウを表示 */
  size(512, 512);
}

void draw() {
  /* 背景を黒くする */
  background(0);
  /* 原点を画面中央へ寄せる */
  translate(width/2, height/2);
  rotate(PI);

  /* 描画の色を緑にする */
  stroke(0, 255, 0);
  fill(0, 255, 0);

  /* 角度は2π/φ[rad]ごとにプロットする */
  /* つまり円一周をを黄金比で割った値 */
  float theta = 2*PI/golden_ratio;
  float x, y;

  for (int i = 0; i < width/2; i++ ) {
    /* iは中心からの距離であり,また点の番号でもある */
    /* 原点からiの距離,角度i*thetaにプロット */
    x = i * cos(i*theta);
    y = i * sin(i*theta);

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