C言語プログラムでprintf()関数を使うと画面(正確にはktemウィンドウ内)へ文字メッセージが出力されることを既に学んだ.これは正確に言えば, 6月6日の実習内容「コマンドのフィルタコマンドとリダイレクション」で学んだ,「標準出力」へ文字データが出力されていることを意味している.Linuxは自作したプログラムも標準コマンドも標準入出力の取り扱いを区別しないため,自作プログラムだけでは難しい処理であっても,標準コマンドとの組み合わせによって実現することが出来る.ここでは,自作プログラムとGNUPLOTを組み合わせて簡単な数学グラフのアニメーションを表示することを考える.
GNUPLOTは各種のグラフを描画処理するプログラムだが,グラフ描画の命令をキーボードから与える代わりに,事前にファイルとして命令内容を準備しておき,それをリダイレクション,或いは,パイプラインを用いて,標準入力から読み取らせて動作させることが出来る.例として,一次関数と二次関数のグラフを重ねて描画して,それをアニメーション表示するための命令を並べたテキストファイルを以下に用意してある.
/NF/class0/oomoto/program/final/sample.gpl
このファイルを各自の適当な作業ディレクトリにコピーして,以下の要領でGNUPLOTに読み取らせて動作させてみよ.
% gnuplot < sample.gpl % cat cample.gpl | gnuplot
このsample.gplには,GNUPLOTの命令が書き並べてあり,GNUPLOTは,標準入力より,これら命令が与えられると,順番に実行して画面にグラフを描画してゆく.
この例では,少しずつ異なったグラフが連続して描画される結果,人間の視覚にはグラフが動いて見える.これがアニメーションの基本原理である.
尚,GNUPLOTのコマンド命令のうち,pauseコマンドは,そこで指定された秒数だけ一時停止するというコマンドであり,これによりアニメーションが目に留まるようにしている.もし,この一時停止が無ければ,GNUPLOTは全速力で全てのグラフを描画してしまい,あまりに速すぎて肉眼では見えない.
ここで,C言語を使って,このテキストファイルと同じ内容を標準出力へ吐き出すプログラムが
/NF/class0/oomoto/program/final/plot.c
である.これを各自の作業ディレクトリにコピーして,コンパイル&実行してみよ.
% gcc -o plot plot.c % ./plot
このplot.cは,printf()関数で画面へ文字を表示する.すなわち,標準出力へ文字を出力している.従って,通常のLinuxコマンドと同様に画面に出力されるはずの内容をリダイレクトして.,テキストファイルに保存することが出来る.
% ./plot > myplot.gpl
このように保存したmyplot.gplをEmacsで開いて内容を確認すると,sample.gplと全く同様の内容になっていることが分かる.従って,myplot.gplファイルは,同じようにGNUPLOTに読み込ませて処理させることが出来る.
% gnuplot < myplot.gpl % cat myplot.gpl | gnuplot
ここで,以下のコマンドを実行してみると,catコマンドは, myplot.gpl の内容をそのまま標準出力へ吐き出しているだけであることが判る.
% cat myplot.gpl
ということは,plot.cプログラムが出す出力を一旦ファイルにリダイレクトして保存せずとも,直接,GNUPLOTの標準入力へパイプラインで繋いでも同じようにグラフを描画できそうに思える.実際,それは可能である.
% ./plot | gnuplot
これから判るように,自作のC言語プログラムであっても,printf()関数を使ってGNUPLOTの描画命令を標準出力に出すように作成すれば,これをパイプラインで組み合わせてGNUPLOTのグラフ処理機能を活用できることが分かるだろう.これに対し,例えば,EGGXのライブラリを用いて,二次関数グラフを表示する部分までプログラムを自作することを想像してみれば,その作業は相当に難しいであろうことは容易に予想が付く.
Linux (UNIX) を利用する場合,解決したい問題に対して,そのためのプログラムを全て自作するのではなく,既に用意されたコマンドを適材適所で上手に組み合わせることで,能率良く作業結果が得らないかと考えるべきである.UNIXの設計思想は,コンピュータを使い慣れたプロフェッショナルが,そのように効率良く作業が出来ることを目標に置いている.
プロが小気味よく作業できるために,UNIX (Linux)の操作はキーボードからコマンドを与えるCUI (Character-based User Interface)が主体となっているとも言える.
一次関数 y = 2x のグラフを直線 L とする. 二次関数 y = x^2 のグラフをX軸方向にa, Y軸方向にbだけ平行移動したグラフのうち,Lと接するものを放物線Pとする.aが-4から4まで刻み幅1で変化する時(a = -4, -3, ...., 3, 4),LとPのグラフの状態をアニメーション表示するC言語プログラム parabora.c を作成せよ.尚,グラフ描画についてはGNUPLOTを組み合わせて用いるものとする.
但し,アニメーションの実現にあたっては,以下のような形のfor文を用いる事.
int a;
.......
for (a = -4; a <= 4; a++) {
.....
}
レポ−ト名:oomoto/program/final1
提出期限:7/21(土曜日)
アニメーションの原理は,少しづつ異なる絵を短い時間で切り替えることによって起きる錯覚に基づいている.EGGXのグラフィックスを用いても,同じようにアニメーションを実現することが出来る.以下のサンプルプログラム
/NF/class0/oomoto/program/final/anim.c
は,円がウィンドウの左右両端でいつまでも跳ね返って往復運動しているように見えるアニメーションを表示するものである.
サンプルプログラム
/NF/class0/oomoto/program/final/bound
は円が斜め45度に直線運動して,ウインドウ端に当たると光の反射のように反射し,一周すると一時停止した後,何かキーボードを押すと終了するプログラムである.これと同じ動作をするC言語プログラム bound.c を作成せよ.
レポ−ト名:oomoto/program/final2
提出期限:7/21(土曜日)