このページはそのうち完成させます。上のgifはパワーポイントに貼ってプレゼンでも使えます。
gnuplotでアニメーションをする方法は色々あるけれど、上の図のように沢山の点が何回も動く場合は
1. 各点の位置情報をテキストファイルに保存。 2. ファイルをgnuplotで読み込んで一気に表示。を繰り返すのが早い。
#include <stdio.h> #include <windows.h> // for Sleep #include <winbase.h> #define GNUPLOT_PATH "C:/gnuplot/bin/pgnuplot.exe" // pgnuplot.exeもしくはgnuplot.exeの場所 void main(){ FILE *gp, *fp; int i,nod; // 初期配置 double X[9][2] = {{0.0,0.0},{0.1,0.0},{0.2,0.0}, {0.0,0.1},{0.1,0.1},{0.2,0.1}, {0.0,0.2},{0.1,0.2},{0.2,0.2}}; // Animation settings // gnuplotを動かすためのコマンド if ((gp = _popen(GNUPLOT_PATH, "w")) == NULL) { printf("gnuplot open error!!\n"); exit(EXIT_FAILURE); // エラーの場合は通常、異常終了する } // Gnuplot操作 fprintf(gp, "set size square\n"); // figureを正方形に fprintf(gp, "set xrange [%f:%f]\n",0.0,3.0); // 範囲の指定 fprintf(gp, "set yrange [%f:%f]\n",0.0,3.0); fprintf(gp, "unset key\n"); // 凡例を表示しない // 点の位置を動かす for(i=0;i<30;i++){ fp = fopen("move_point.dat", "w"); // "上書き"モードでファイルを開く。 fprintf(gp, "set title 't = %d'\n",i); // タイトルを設定 for(nod=0;nod<9;nod++){ // 9個の点の位置をファイルに保存 fprintf(fp,"%f %f\n",X[nod][0],X[nod][1]); // 点nodの位置をファイルに書き込み X[nod][0] += 0.1; X[nod][1] += 0.1; // 点nodの位置を0.1ずつずらす } fprintf(gp,"plot 'move_point.dat' w p pt 7 ps 0.5\n"); // gnuplotで点を描く fclose(fp); // 位置を書いているファイルを閉じる fflush(gp); // バッファに格納されているデータを吐き出す(必須) Sleep(100); // なくてもよい。 } system("pause"); fprintf(gp, "exit\n"); // gnuplotの終了 fflush(gp); // バッファに格納されているデータを吐き出す(必須) _pclose(gp); }
上の解説。
'move_point.dat'というファイルに各点の位置を書き換えながら保存していく。
初期配置の場合、'move_point.dat'の中身は
0.0 0.0 0.1 0.0 0.2 0.0 0.0 0.1 0.1 0.1 0.2 0.1 0.0 0.2 0.1 0.2 0.2 0.2となっている。点の位置(Xの値)を動かしたら、このファイルを書き換える。追記ではないことに注意。
plot 'move_point.dat' w p pt 7 ps 0.5 # pointsizeは50%となる。
アニメーションをgifファイルアニメーションにするには、
1. 各状態の画像をgifファイルで保存。30ステップ分なら30枚。 2. これらのgifファイルをgiamdでつなげて一つのgifアニメーションにする。という手順をふむ。
具体的には、上のアニメーションのプログラムの、Sleep(100)の一つ上の行に、
fprintf(gp,"name='move%02d'\n load 'savegif.gp'\n",i+1);を追記する。savegif.gpの中身は、
if (exists("name")){ filename = sprintf("%s.gif",name); set terminal gif enhanced # terminalをgifに変更 set output filename # ファイル名で保存場所を指定可能 pause 1 # 1秒待つ。PCが高速の場合は処理を待つために必要。 replot # 必要 set output # 必要。これで、先ほど作ったgifがcloseされる。 set terminal wxt # ターミナルをもとに戻す(wxtでなくても良い) }else{ pause -1 "nameを指定して下さい。name='ファイル名'" }とし、適当なフォルダに置いておく。上のコマンドの場合は、.cがあるフォルダと同じ場所。