Pythonで描くバーンズリーのシダ ― 反復関数系(IFS)によるフラクタル図形の作成方法
はじめに
このチュートリアルでは、マイケル・バーンズリー(Michael Barnsley)によって考案されたバーンズリーのシダ(Barnsley Fern)について学びます。バーンズリーのシダは、その名の通り本物のシダ植物に非常によく似た形状を持つフラクタル図形です。この図形は、反復関数系(Iterated Function System:IFS)と呼ばれる4つの数式を繰り返し適用することで生成されます。
座標の変換は、次の行列形式の式で表されます。
f(x,y)=$$\begin{bmatrix}a & b \\c & d \end{bmatrix}\begin{bmatrix}x \\y \end{bmatrix}+\begin{bmatrix}e \\f \end{bmatrix}$$
出典 − Wikipedia
各変数には以下の値が設定されます。

出典 − Wikipedia
バーンズリーが提案した4つの式は以下の通りです。

出典 − Wikipedia
それでは、Pythonでシダの形状を描画するコードを見ていきましょう。
コード例
# グラフ描画用にmatplotlibモジュールをインポート
import matplotlib.pyplot as plot
# 乱数生成用にrandomモジュールをインポート
import random
# リストを初期化
x = [0]
y = [0]
# 現在位置を追跡するための変数をゼロで初期化
current = 0
for i in range(1, 1000):
# 1から100までのランダムな整数を生成
z = random.randint(1, 100)
# zの範囲を判定し、対応する値をxとyに追加
if z == 1:
x.append(0)
y.append(0.16 * y[current])
if z >= 2 and z <= 86:
x.append(0.85 * x[current] + 0.04 * y[current])
y.append(-0.04 * x[current] + 0.85 * y[current] +1.6)
if z>= 87 and z<= 93:
x.append(0.2 * x[current] - 0.26 * y[current])
y.append(0.23 * x[current] + 0.22*(y[current])+1.6)
if z >= 94 and z <= 100:
x.append(-0.15 * x[current] + 0.28 * y[current])
y.append(0.26 * x[current] + 0.24 * y[current] + 0.44)
# currentの値をインクリメント
current += 1
# xとyを使ってグラフを描画
plot.scatter(x, y, s = 0.2, edgecolor = 'green')
plot.show()
実行結果
上記のコードを実行すると、以下のようなシダ型のフラクタル図形が出力されます。

仕組みのポイント
このプログラムでは、1〜100の乱数を生成し、その値に応じて4つのアフィン変換から1つを選択して座標を更新しています。それぞれの変換が選ばれる確率が異なるため(例えば茎に相当する変換は約85%の確率で選ばれる)、繰り返し回数を重ねるほど本物のシダに近い精緻な構造が浮かび上がります。反復回数を増やせば、より詳細なフラクタル模様を確認できます。
まとめ
このチュートリアルでは、反復関数系(IFS)を用いてバーンズリーのシダをPythonで描画する方法を解説しました。単純な数式と乱数の組み合わせだけで、自然界に見られるような複雑な図形が生まれる点がフラクタルの魅力です。チュートリアルの内容についてご不明な点があれば、コメント欄でお知らせください。
参考 − Wikipedia
-
【初心者向け】Pythonのissuperset()メソッドの使い方をわかりやすく解説
はじめにこの記事では、Pythonのissuperset()メソッドについて、基本的な仕組みから実際のコード例まで詳しく解説します。issuperset()は、セット(集合)に対して使用できるメソッドで、引数として渡されたセットのすべての要素が、呼び出し元のセットに含まれているかどうかを判定します。呼び出し元のセットBが、引数のセットAのすべての要素を含んでいる場合 → True を返すセットAの要素がすべてBに含まれていない場合 → False を返すつまり、「BがAの上位集合(スーパーセット)であるかどうか」を判定するためのメソッドです。基本構文B.issuperset(A)この式は、Bが
-
PythonでQuine(クワイン)プログラムを書いてみよう
「Quine(クワイン)」とは、入力を一切受け取らずに、自分自身のソースコードを出力する特殊なプログラムのことです。一見すると不思議な自己言及的な仕組みですが、実装にはいくつかの厳格なルールがあります。最も重要な条件は、プログラム内部からソースコードファイルを読み込んではいけないという点です。つまり、純粋にコード自身の論理だけで自分の内容を再現しなければなりません。 サンプルコード Pythonでは、わずか1行でQuineを実現できます。 a=a=%r;print (a%%a);print (a%a) 実行結果 a=a=%r;print (a%%a);print (a%a) ご覧のとお