バーンスレイのシダ(フラクタル)をPythonで描いてみる

どうも、木村(@kimu3_slime)です。

今回は、バーンスレイのシダ(Barnsley fern)と呼ばれるフラクタル図形を、Pythonで描く方法を紹介します。

参考:Real lady ferns. – Sanjay ach

 



プログラムの紹介

さっそくプログラム例を紹介しましょう(「Pythonからはじめる数学入門」を参考にしています)。

少し長いですが、コメントで説明が書いてあります。

 

内容を簡単に紹介しましょう。

まず、\((0,0)\)に点が打たれます。その点を変換(transformation)で繰り返して移していき、できあがるのがシダの図形です。

変換は4種あり、点を打つ度に1つがランダムに選ばれます。1つは茎・葉を伸ばす。2つは、茎に対して左もしくは右の葉を作る。最後は、最初の茎に戻ってリセットする。4つの変換の繰り返しなので、そう難しくはありませんが、できあがる図形はそれらしいものですね。

 

今回の変換は、\(A\)を\(2\times 2\)の行列として、\(f(x)= Ax +b\)と表されます。線形変換\(Ax\)に平行移動\(b\)を加えた変換は、一般にアフィン変換(Affine transformation)と呼ばれます。

特に、最もよく選ばれる1番目の変換の線形変換の部分に注目してみましょう。

\[ \begin{aligned}\begin{pmatrix} 0.85 & 0.05 \\ -0.05 & 0.85 \end{pmatrix}= c\begin{pmatrix} \cos \theta & \sin \theta \\- \sin \theta & \cos \theta \end{pmatrix}\end{aligned} \]

これは回転行列と呼ばれるもので、(\(\sin\)の符号に注意して)時計回りに\(\theta\)だけ回転させる変換を表しています。(\(c\approx 0.851\)は倍率を定める適当な定数)

数値的に計算してみると、約\(3.37^{\circ}\)の回転です。この角度で曲がりながら、\(y\)軸のシフト\(1.6\)によって斜め右上に進んでいくように見えるわけです。

 

今回紹介した図形は、イギリスの数学者バーンスレイが著書「Fractals Everywhere」で提案したものです。

この図形は、拡大しても拡大しても、同じような図形が登場します。このように、部分と全体が自己相似になっている図形は、一般にフラクタル(Fractals)と呼ばれています。

参考:フラクタル – Wikipedia

 

フラクタルは、湾岸地域の地形(リアス式海岸)や、ブロッコリーの仲間であるロマネスコなど、自然によって作られる形を近似しているように見えます。(フラクタル生成と同様の仕組みが働いているかどうかはわかりませんが)

画像引用:A Broccoli variety Romanesco, grown in the field – Fk

また、今回紹介したシダ以外にも、シェルピンスキーのギャスケット、雪印曲線(コッホ曲線)、メンガーのスポンジ、マンデルブロ集合など、よくわからなくても見ていて楽しいフラクタルは多くあります。

ぜひ、フラクタルについて調べて、今回のシダのプログラムに触れてみてください。

木村すらいむ(@kimu3_slime)でした。ではでは。

 

Pythonからはじめる数学入門
Amit Saha
オライリージャパン
売り上げランキング: 62,016

 

フラクタル幾何学(上) (ちくま学芸文庫)
B.マンデルブロ
筑摩書房
売り上げランキング: 315,630

 

こちらもおすすめ

2次方程式をプログラムで解くときに気をつける「誤差」とは?

ネイピア数eをPython(decimal)で100桁計算してみよう