目次/第13章
螺旋は、描かない
phyllotaxis — 葉序・黄金角・フィボナッチ
- ロマネスコやひまわりの螺旋は、螺旋を描いて作るのではありません。
- 1個置くごとに 137.5° ずつ回すだけ。すると螺旋が勝手に見えてきます。
- しかもその本数は 8・13・21 ……とフィボナッチ数になります。狙って作った数ではありません。
ロマネスコの写真を見ると、螺旋が右回りと左回りに走っているのが分かります。 数えると8本だったり13本だったり21本だったりします。 これをプログラムで作ろうとして、螺旋を線として描き始めると、まず失敗します。 螺旋は、作った結果として出てくるものであって、作るものではありません。
やっているのは、たった1行です。
const th = th0 + i * 2.3999632; // i 番目の子の方位。2.3999632 rad = 137.5°
1個置くたびに137.5°回す。それだけです。この角度を黄金角といいます。 植物が葉や種をつける角度で、葉序(ようじょ)と呼ばれる仕組みです。
なぜ137.5°なのか
植物にとって、あとから出る葉は先に出た葉の真上に来ると困ります。日陰になるからです。 では「いちばん重ならない角度」は何度か。 たとえば90°だと、4個置くと元に戻ってしまい、4方向にしか葉が出ません。 120°なら3方向。分数で表せる角度は、必ずどこかで重なります。
だから、いちばん分数で表しにくい数を使えばいい。 それが黄金比 φ = (1+√5)/2 で、360° ÷ φ² ≒ 137.507°。 これが「もっとも重ならない角度」になります。
螺旋の本数がフィボナッチ数になる理由
i 番目と i+m 番目が同じ方向に並んで見えるのは、 m 個ぶん回した角 m×137.5° が、ちょうど1周の整数倍に近いときです。 そういう m を小さいほうから探すと、1, 2, 3, 5, 8, 13, 21, 34 …… つまりフィボナッチ数が出てきます。 この m が、そのまま目に見える螺旋(斜列)の本数です。 下の実験で角度を少しずらすと、本数がフィボナッチ数から外れ、 同時に見た目が「植物らしくなくなる」のが分かります。
実験 — 角度をずらしてみる
137.5 から 0.5 ずらすだけで、螺旋がほどけて「腕」が見えはじめます。
球の上に均等に置く — フィボナッチ格子
同じ考え方は、球の表面に点を均等にばらまくのにも使えます。 緯度・経度で等分すると極のあたりだけ混み合います(06章のUVと同じ問題です)。 そこで、高さ方向を等間隔に切って、方位を137.5°ずつ回す。 すると、どこでも同じ密度で並びます。
// フィボナッチ球。等面積で並ぶので密度が極でも崩れない const lz = 1 - 2 * (k + 0.5) / M; const lr = Math.sqrt(Math.max(0, 1 - lz * lz)); const th = k * 2.3999632 + spin; const d = vec(lr * Math.cos(th), lr * Math.sin(th), lz);
おまけ — 螺旋の格子は「まっすぐ」にできる
ロマネスコには都合のいい性質があります。 対数極座標 (x, y) = (θ/2π, ln f / ln λ) という座標に取り替えると、 葉序の格子はどの階層でも、まったく同じ形の格子になります。 螺旋が、ただの斜めの格子になるのです。 だから1枚のテクスチャを、大きさの違う何千個の円錐すべてに貼り回せます。 ロマネスコ.js が数万個の小塔を実時間で組めているのは、ここのおかげです。
粒の半径を「格子の目盛」で決めてはいけません。
黄金角の格子では、いちばん近い節点は「1つ隣」ではなく、
フィボナッチ数だけ離れた節点です。しかもその距離は5〜6目盛にもなります。
目盛を基準に「半径0.6」と決めると、粒がぽつぽつ散った点描になります。
ロマネスコ.js は、最初に最近接距離 DMIN を総当たりで求めてから、
それを基準に粒の大きさを決めています。
- 137.5°のまま「斜列を線でつなぐ」を入れて、赤・青・黄の線がどう走っているか見る。
- 角度を135.0°にする。螺旋がほどけて放射状の腕になることを確かめる。
- 置く数を40から600まで動かす。本数が 5/8/13 → 13/21/34 → 34/55/89 と、フィボナッチ数を1つずつ繰り上がっていくのを見る。
- ひまわり・松ぼっくり・パイナップルの写真で、螺旋の本数を数えてみる。