● グラフィック出力
計算結果の数値データを綺麗にグラフ化してくれるグラフ作成ソフトは
各種出回っているが、グラフだけでは計算対象である物理の姿は
よく見えない。やはりグラフィックを描くプログラムの作り方を知って
おく方が良いだろう。計算結果をグラフィックで可視化することで
プログラムと物理に対する親しみがより一層深まるであろう。
しかしながら、C/C++言語には統一的なグラフィックの描き方の定義が無い。
なぜならC/C++言語は汎用な言語であり、あらゆる環境で同じ文法で
プログラムが書かれなければならないのであるが、グラフィックのような
環境依存の激しい操作に統一的な文法は定められないからである。
このため、かつては各環境においてコンパイラ製作者などが独自規格の
グラフィックライブラリを作成して提供していた。もちろん文法は
それぞれ全く異なり、プログラムに移植性は無い。
こうした不便さを解決すべくソフトウェア業界の多くが提携して定めた
グラフィックライブラリの標準規格に OpenGL がある。この規格に沿った
グラフィックライブラリが企業、個人によりさまざまな環境向けに作成され
配布されている。その結果、OpenGL の文法で設計したプログラムは
XWindows,iMac,MS-Windows98 などでもそのまま利用できるようになった。
本書ではXWindos System において標準である Xlib グラフィックライブラリ
を用いて、グラフィックを描くことにする。
もちろん、この方法は他の環境(iMac,MS-Windows98など)では使えない。
XlibはXWindowのあらゆるグラフィックを実現するため、かなり複雑な描画も
できるが、そのためXlibの関数には設定項目が多い。簡単なグラフィックを
描く目的にはXlibの関数をそのまま用いるのはやや大袈裟である。
そこで基本的な描画を簡単に行う道具として、
本書は nxgraph という名の小さなグラフィックライブラリを提供する。
nxgraphは複雑なXlibの関数の呼び出しを我々に代わって行ってくれる。
さらにnxgraphはグラフィックをファイルに書き出すこともできる。
これを論文に貼り付けて印刷することも簡単である。
nxgraphの文法をここで簡単に紹介するが、使い方は簡単なので以降に解説
する物理計算の実践例での使われ方を見ればすぐに明らかになるであろう。
より詳細な使用法の解説はファイルにまとめてある。
■ nxgraphの関数
nxgraphが提供する関数の一部の簡単な意味を紹介する。
- void NXOpenWindow( char* wname, int w, int h )
Windowを開く関数
プログラム冒頭でこの関数を呼ぶ。wname がwindowのtitleとなる。
w,h がwindowの横縦のサイズ。
- void NXCloseWindow( void )
Windowを閉じる関数
プログラムの最後でこの関数を呼ぶ。
- void NXOpenFile( char* fname, int w, int h )
Fileを開く関数
EPSまたはFIG形式でファイルfname に出力する場合に呼ぶ。
w,h はファイルが印刷される時のサイズ。
- void NXCloseFile( void )
Fileを閉じる関数
NXOpenFile() を使ったら、プログラム最後で必ずこの関数を呼ぶ。
- void NXClearWindow( void )
描画された絵を消す関数
window内を真っ白にする。
- void NXFlush( void )
描画を完了させる関数
まとまった量の描画命令を呼び終えた後にこの関数を呼ぶ。
- void NXEnable( int func )
種々の機能の有効にする関数
アニメーションをちらつき無く描く機能を有効にしたり、
ファイルへの出力を再開する時などに呼ぶ。
- void NXDisable( int func )
種々の機能の無効にする関数
ファイルへの出力を一時停止する時などに呼ぶ。
- void NXSetColor( u\_long pixel )
描画色を指定する関数
描画色には NX_RED 等24色の基本色がすぐに使える。
- void NXDrawPoint( int x, int y )
点を描く関数
座標系はwindowの左上が原点で右向きにx軸、下向きにy軸である。
- void NXDrawLine( int x1, int y1, int x2, int y2 )
線分を描く関数
2点を結ぶ線分が描かれる。
- void NXDrawMoveto( int x, int y )
連続線分の始点を指定する関数、座標指定を省略することもできる。
- void NXDrawLineto( int x, int y )
連続線分の頂点を指定する関数
第1点をNXDrawMoveto() で指定し、以後NXDrawLineto()
を連続して呼ぶことで継った線分が描かれる。
- void NXDrawRectangle( int x, int y, int w, int h )
長方形の枠を描く関数
x,y が左上隅の座標。w,h が横縦の長さ。
- void NXDrawCircle( int x, int y, int r )
円の弧を描く関数
x,y が中心の座標。r が半径。
- void NXDrawPrintf( int x, int y, const char* format, ... )
printf関数の書式で文字列を描く関数
windowの指定位置にグラフィックとして文字列を描く。
- int NXCheckEvent( int wait, XEvent& ev )
マウスのボタンやキーの変換を検知する関数
ユーザーからのプログラムの終了の合図を受け取ることに使われる。
- void NXSaveWindow( char* fname )
Window内の画像をファイルに保存する関数
fname のファイル名の拡張子の画像形式で保存する。
コンパイルはかなり面倒で次の長い呪文を唱える。Windowに絵を描くだけの
場合。
gcc -o main main.cc -O2 -I/usr/X11R6/include -L/usr/X11R6/lib -lX11
EPS形式のファイルを同時に出力する場合。
gcc -o main main.cc -DNX_EPS Elib.o -O2 -I/usr/X11R6/include -L/usr/X11R6/lib -lX11
FIG形式のファイルを同時に出力する場合。
gcc -o main main.cc -DNX_FIG Flib.o -O2 -I/usr/X11R6/include -L/usr/X11R6/lib -lX11
ただし環境によって上記のpathが異なるので各自調整すること。
最後にこれらライブラリを併せて、データ加工の流れ図を紹介する。
このように計算機を多いに利用してほしい。
データ加工の流れ図
次へ
目次
Copyright(C) by Naoki Watanabe. Oct 21st, 1995.
渡辺尚貴 naoki@cms.phys.s.u-tokyo.ac.jp