ここでは、繰り返し関数システム、略してIFSについて扱います。ここでは繰り返し変換が行われます。空間が何度も自分自身にマッピングされます。このプロセスにはさまざまなマッピング規則があり得ます。理想的にはこれを無限に行い、すべての間で不変である空間内の集合を考察します。この集合はフラクタルになる可能性があります!
理論はさておき、Wikipediaで基本的な内容を、そして素晴らしい本でより深く理解することができます。では、これをどのように生成するのでしょうか? 最も簡単な方法は「カオスゲーム」と呼ばれるものです。一点を取り、その点に一つの変換を適用します。変換によって不変である点集合に関わるため、目的の点は集合内に落ちなければなりません。この新しい点でプロセスを繰り返し、何千回も繰り返して図が浮かび上がるまで続けます。
それでは、有名なバーンズリー・ファーンでこれを実行しましょう!
しかし、どうやって? ループとアフィン変換を計算する能力が必要です。pgfmathでこれは可能ですが、私の見解では読みにくいです。そのため、通常のプログラミング言語を統合できる利点を活かしてLuaを使用します。これにより、コーディングは簡単になります。パラメータは行列に書き込まれます。つまり、変換パラメータとカオスゲームの変換選択の確率です。点を走らせましょう!
翻訳にはLuaTeXと忍耐が必要です。試行錯誤やパラメータの調整をするときは、最初は反復回数を少なくしてください。
% !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}
