gnuplotでアニメーション
gnuplotでフラクタル(Tree)
gnuplot では「call」関数を使用することで引数を与えて再帰的にファイルを読み込むことができます。
これはフラクタルを描画する際に重宝します。
基本アルゴリズムは下記の図書を参考にしました。
■参考図書:gnuplotの精義―フリーの高機能グラフ作成ツールを使いこなす [単行本]
フラクタル「Tree」
gnuplotでアニメーション 直接 gif アニメーションを出力すると同様に、パラメータを変化に対するアニメーションを作成します。 今回は、フラクタルの世代を変化させます。
メインルーチン:tree_main.plt
今回はメインルーチンの他、gifアニメーションと再帰関数用のサブルーチンが2つ必要になります。
set xrange [-1.5:1.5] set yrange [0:3.5] set nokey set terminal gif animate optimize size 600, 480 set output "tree.gif" set tics font 'Times,18' max_n = 30 n=0 load "tree_sub1.plt"
サブルーチン1:tree_sub1.plt
gifアニメーションを作成するため、変数「n」を変化させてプロットします。
if (exist("n")==0 || n<0) n=0 #変数の初期化 DATA = "tree.data" set print DATA set angle degree ratio = 0.7 dang = 15 min_len = n<=max_n/2 ? ratio**n : ratio**(max_n-n) call "tree_sub2.plt" "0" "0" "90" "1" title(n) = n<=max_n/2 ? sprintf("n = %d",n) : sprintf("n = %d", max_n-n) #タイトル名 unset label set label title(n) font 'Times,20' at -1.4 , 3.3 plot DATA with line linecolor rgbcolor "blue" if (n<max_n) n=n+1; reread
サブルーチン2:tree_sub2.plt
フラクタルの再帰関数を定義します。
下記アルゴリズムは参考図書を利用させていただきました。
print $0, $1 print $0 + $3*cos($2), $1 + $3*sin($2) print "\n" if(min_len < $3) call "tree_sub2.plt" \ "$0 + $3*cos($2)" "$1 + $3*sin($2)" "$2+dang" "ratio*$3" if(min_len < $3) call "tree_sub2.plt" \ "$0 + $3*cos($2)" "$1 + $3*sin($2)" "$2-dang" "ratio*$3"
その他
上記アルゴリズムの「dang」を「0~30」まで変化させた場合のアニメーション。