以前にフラクタルの父マンデルブロのマンデルブロ集合のことを書いたが、それとは別のフラクタル話でよく取り上げられるもののひとつに、バーンズレイのシダがある。座標平面上の任意の点に対して、ある4つのアフィン変換をある確率で次々に適用していったときの軌跡が、右のように自然界のシダの葉そっくりになるというものだ。

学生のときに読んだ本でこれに出会ったとき、4つのアフィン変換と確率を、バーンズレイがどうやって決めたのかがとても不思議だった。読んだ本のどれかに、「ポインティングデバイスのマウスを使ってアフィン変換の組を決めた」のようなくだりがあったものの、その具体的な内容には触れられていなかったのだ。

バーンズレイのシダを Mathematica 8 で単に描くだけなら、あまり苦労することはない。描く原理の説明はウェブのそこここで見ることができるので、ここでは簡単に。

アフィン変換とは座標変換の一種で、次のような式で表せる変換のことだ。

この式中の変換パラメーター a〜f を次の表(これは本稿執筆時の Wikipedia のページから引用したもの)に従って決定し、平面上の適当な点から始めて変換を繰り返していく。各行のパラメーターセットは、表の「使用確率」に書かれた頻度で使用する。このようにして変換ごとの座標点をプロットしていくとシダの葉が現れる。

abcdef使用確率[%]
0000.16001
0.850.04-0.040.8501.685
0.2-0.260.230.2201.67
-0.150.280.260.2400.447

Mathematica での書き方はいろいろ考えられるけど、せっかく(?)なので、アフィン変換を TransformationFunction で、確率の部分には RandomChoice を使うと、例えば次のように書くことができる。TransformationFunction(AffineTransform)と RandomChoice は ver.6 で追加された関数だ。

affines = Map[AffineTransform,
 {{{{0, 0}, {0, .16}}, {0, 0}},
  {{{.85, .04}, {-.04, .85}}, {0, 1.6}},
  {{{.2, -.26}, {.23, .22}}, {0, 1.6}},
  {{{-.15, .28}, {.26, .24}}, {0, .44}}}];
pts = NestList[
  Function[{pt}, RandomChoice[{1, 85, 7, 7} -> affines][pt]],
    {0, 0}, 20000];
ListPlot[pts, Frame -> True, Axes -> False, AspectRatio -> Automatic]

こうして描画した座標点の全体を、各行のパラメーターセットで再変換して重ねてみると、各パラメーターセットの意味が明白になる。

GraphicsRow[Map[Function[{f}, ListPlot[{pts, f[pts]},
  Axes -> False, AspectRatio -> Automatic]], affines]]

この4つの図は、上で描いたシダの全描画点を、表の1行目から4行目の各パラメーターセットを使って変換して、シダの全描画点と重ねたものだ。左から順に、表の1行目〜4行目に対応している。1行目のパラメーターセットでの変換が、シダの葉全体を葉柄の根元付近に写像すること、2行目のパラメーターセットが、シダの葉全体を根元近くの2本の枝を払った部分に、3行目が全体を左側の最初の枝全体に、4行目が右側の最初の枝に写像する変換であることが分かる。

表の使用確率の値は、アフィン変換のパラメーターほどは、形態に影響を与えない。もちろん、バランスが大きく変わると見た目に影響が出るが、少しくらい変えてもシダの葉は問題なく再現される。少し長いが、次のコードでこれを確認することができる。

Manipulate[Module[{pts = NestList[
 Function[{pt}, RandomChoice[{p1, p2, p3, p4} -> affines][pt]],
  {0, 0}, 20000]},
 ListPlot[pts, Frame -> True, Axes -> False, AspectRatio -> Automatic]],
 {{p1, 1}, 0, 100, Appearance -> "Labeled"},
 {{p2, 85}, 0, 100, Appearance -> "Labeled"},
 {{p3, 7}, 0, 100, Appearance -> "Labeled"},
 {{p4, 7}, 0, 100, Appearance -> "Labeled"},
 ContinuousAction -> False,
 Initialization :> (affines = Map[AffineTransform,
  {{{{0, 0}, {0, .16}}, {0, 0}},
   {{{.85, .04}, {-.04, .85}}, {0, 1.6}},
   {{{.2, -.26}, {.23, .22}}, {0, 1.6}},
   {{{-.15, .28}, {.26, .24}}, {0, .44}}}])]

自分で拾って来たシダの葉(ないしは、自己相似の特徴が良く現れている他の自然物)を使って、このようなアフィン変換パラメーターセットを作るというのは、書き始めると長くなるので、稿を改めてまたの機会に(ホントか?>自分)。

※この記事の内容は執筆者の個人的見解で、ヒューリンクスによる公式情報ではありません。[免責事項]

トラックバック

この記事へのトラックバックURL
http://blog.hulinks.co.jp/cgi/mt/mt-tb.cgi/468
内容に対しての関連性がみられないものは削除する場合があります

コメントの投稿

Emailアドレスは表示されません。は必須項目です。
ヒューリンクス取り扱い製品の内容や購入に関するお問い合わせはヒューリンクスサイト連絡先へお願いいたします。投稿前にその他の注意事項もご覧ください。

HULINKS サイトの新着情報