フラクタル:繰り返し関数系のバーンズリー・ファーン

ここでは、繰り返し関数システム、略してIFSについて扱います。ここでは繰り返し変換が行われます。空間が何度も自分自身にマッピングされます。このプロセスにはさまざまなマッピング規則があり得ます。理想的にはこれを無限に行い、すべての間で不変である空間内の集合を考察します。この集合はフラクタルになる可能性があります!

理論はさておき、Wikipediaで基本的な内容を、そして素晴らしい本でより深く理解することができます。では、これをどのように生成するのでしょうか? 最も簡単な方法は「カオスゲーム」と呼ばれるものです。一点を取り、その点に一つの変換を適用します。変換によって不変である点集合に関わるため、目的の点は集合内に落ちなければなりません。この新しい点でプロセスを繰り返し、何千回も繰り返して図が浮かび上がるまで続けます。

それでは、有名なバーンズリー・ファーンでこれを実行しましょう!

しかし、どうやって? ループとアフィン変換を計算する能力が必要です。pgfmathでこれは可能ですが、私の見解では読みにくいです。そのため、通常のプログラミング言語を統合できる利点を活かしてLuaを使用します。これにより、コーディングは簡単になります。パラメータは行列に書き込まれます。つまり、変換パラメータとカオスゲームの変換選択の確率です。点を走らせましょう!

翻訳にはLuaTeXと忍耐が必要です。試行錯誤やパラメータの調整をするときは、最初は反復回数を少なくしてください。

The Barnsley fern

% !TEX lualatex
\documentclass[tikz,border=10pt]{standalone}
\usepackage{luacode}
\begin{luacode*}
  function barnsley(iterations,options)
    local x = math.random()
    local y = math.random()
    local m = {
        0.0,   0.0,   0.0, 0.16, 0.0,  0.0, 0.01,
       0.85,  0.04, -0.04, 0.85, 0.0,  1.6, 0.85,
        0.2, -0.26,  0.23, 0.22, 0.0,  1.6, 0.07,
      -0.15,  0.28,  0.26, 0.24, 0.0, 0.44, 0.07
    }
    local pm = { m[7], m[7] + m[14], m[7] + m[14] + m[21] }
    if options ~= [[]] then
      tex.sprint("\\draw[" .. options .. "] ")
    else
      tex.sprint("\\addplot coordinates{")
    end
    for i=1, iterations do
      p = math.random()
      if     p < pm[1] then
        case = 0
      elseif p < pm[2] then
        case = 1
      elseif p < pm[3] then
        case = 2
      else
        case = 3
      end
      newx = (m[7*case+1] * x) + (m[7*case+2] * y) + m[7*case+5]
         y = (m[7*case+3] * x) + (m[7*case+4] * y) + m[7*case+6]
         x = newx
      tex.sprint("("..x..","..y..") circle (0.05pt)")
    end
    tex.sprint(";")
  end
\end{luacode*}
\begin{document}
\begin{tikzpicture}
  \directlua{barnsley(20000, [[color=green!50!black,fill]])}
\end{tikzpicture}
\end{document}

Leave a Reply

Your email address will not be published. Required fields are marked *