gnuplotでアニメーション
gnuplotでフラクタル(シダ)
gnuplot では「call」関数を使用することで引数を与えて再帰的にファイルを読み込むことができます。
これはフラクタルを描画する際に重宝します。
前回の「Tree」に引き続き、今回はよく知られているフラクタル「シダ」を作成します。
なお、基本アルゴリズムは下記の図書を参考にしました。
■参考図書:gnuplotの精義―フリーの高機能グラフ作成ツールを使いこなす [単行本]
フラクタル「シダ」
gnuplotでアニメーション 直接 gif アニメーションを出力すると同様に、パラメータを変化に対するアニメーションを作成します。 今回は、描画する点の数を増やしていきます。
メインルーチン:sida_main.plt
今回はメインルーチンの他、gifアニメーションと再帰関数用のサブルーチンが2つ必要になります。
set size ratio 2 set xrange [0.25:0.8] set xtics 0.2,0.1 set terminal gif animate optimize size 600, 800 set output "sida.gif" #set terminal gif optimize size 600, 800 #<------各ステップごとにgifファイルを書き出す際に使用 set tics font 'Times,18' DATA = "sida.data" set print DATA m = 0 load "sida_sub1.plt"
サブルーチン1:sida_sub1.plt
gifアニメーションを作成するため、変数「n」を変化させてプロットします。
if (exist("n")==0 || n<0) n=1 #変数の初期化 m_max = 300 * n call "sida_sub2.plt" "0.5" "0.0" #outfile(n) = sprintf("f/%d.gif",n+1000) #<------各ステップごとにgifファイルを書き出す際に使用 #set output outfile(n) #<------各ステップごとにgifファイルを書き出す際に使用 title(n) = sprintf("N = %d",m_max) #タイトル名 unset label set label title(n) font 'Times,20' at 0.27 , 0.96 plot DATA with dots notitle linecolor rgbcolor "#22bb22" if (n<100) n=n+1; reread
サブルーチン2:tree_sub2.plt
フラクタルの再帰関数を定義します。
下記アルゴリズムは参考図書を利用させていただきました。
if(m==0) x = $0; y = $1 m=m+1 r=rand(0) if(r <= 0.02) xn=0.5; yn=0.27*y if((0.02 < r) && (r <= 0.17)) xn = -0.139*x + 0.263*y + 0.57; yn = 0.246*x + 0.224*y - 0.036 if((0.17 < r) && (r <= 0.3)) xn = 0.17*x - 0.215*y + 0.408 ; yn = 0.222*x + 0.176*y + 0.0893 if(0.3<r) xn = 0.781*x + 0.034*y + 0.1075; yn = -0.032*x + 0.739*y + 0.27; print x, y x=xn; y=yn if(m<m_max) reread