これまで作成してきたプログラム cg の分割ソースコードを再利用して, 新たなプログラム「タートルグラフィックスインタプリタ tg」 を効率的に作成しよう. もし,すでにソースを適切に分割できていれば, 画像生成関数や図形描画関数などの共通部分はライブラリ関数としてそのまま流用し, 相違部分(メイン関数などの新規プログラムに固有な処理)の新規作成だけで済みます.
タートルグラフィックスは, 初心者向けプログラミング言語 LOGO で発明された CG の描画方法(というか,お絵描き方法)だ. カーソル(cursor)をマウスなどで直接操作するのではなく, タートル(turtle; 亀)に命令を与え,絵を描いてもらう.
ここではタートルに与える命令(TG 言語)の仕様を次のように決めておく:
ユーザはこれらのコマンドを組み合わせてタートルに与える. たとえば,正方形を描くには:
forward 100 # 100 歩前進 right 90 # 90 度右旋回 forward 100 right 90 forward 100 right 90 forward 100
さて,このようなコマンドの羅列から グラフィックスを生成するようなプログラムは, 基本的には前回までの cg と同じパターンで実現できる. そして次回は,命令ファイルを効率的に記述できるようにするために, 次のような制御構造を追加する予定:
これらの手続き制御コマンドを利用すれば, 命令ファイルをコンパクトに記述できるようになる. たとえば,上の例と同じ正方形を描くためのコードを, 次のように短く書けるようになる:
repeat 4 forward 100 right 90 end
さらに,これらの手続き制御の繰り返し命令は, ネスト(nest; 入れ子)になっていてもよいことにしよう.
repeat ... repeat ... repeat ... ... end end end
タートルグラフィックスインタプリタ tg の基本プログラムを作成してみよう. このために,すでに作成済みの分割ソース版 cg の ソースコードを再利用する.
$ cp -rp cg/ cg.bak/ $ cd cg/
まず,分割ソース版 cg のディレクトリへ移動しよう. そして,そのディレクトリに,次のソースファイルをダウンロードしよう. (または,安全策として, cg のディレクトリをコピーし, コピー先またはコピー元のディレクトリへのダウンロードでもよいだろう.)
このままでは,まだ,コンパイルできないかもしれない. 各自の分割状況に適合するように, tg.c の内容(ヘッダファイル名,関数名,等) を修正する必要があるだろう. 参考のため,元々の tg.c で仮定しているヘッダファイルの内容を 次に示しておく:
前回までに作成した分割ソース(ヘッダファイルやソースファイル)の内容については 変更しないこと. 今回のソースファイル tg.c だけを変更すること.
また,コンパイルするために, すでに作成済みの Makefile の内容も修正しよう. オブジェクトファイル tg.o およびプログラムファイル tg をターゲットとして エントリを追加:
all: cg tg # これもあると便利かも(make または make all ですべてをコンパイル) tg: tg.o turtle.o pbm.o draw.o ... # 依存ファイル名については各自変更必要 cc tg.o ... tg.o: tg.c turtle.h pbm.h draw.h ... # 依存ファイル名については各自変更必要 cc -c tg.c ... turtle.o: turtle.c turtle.h cc -c turtle.c ... cg: cg.o ... cc cg.o ... ... distclean: -rm cg tg # これも追加必要
まだ Makefile を修得していない人のために orz... 手動でのコンパイル方法:
$ cc tg.c turtle.c pbm.c draw.c -lm -o tg
上級者は,単なるオブジェクトファイル pbm.o や draw.o ではなく, ライブラリオブジェクト libpbm.a や libdraw.a を作成し, それをリンク cc ... -lpbm -ldraw しても良いだろう.
Makefile が完成したら tg を make しよう. それと,以前のプログラム cg についても 再コンパイルできることを確認しておこう:
$ make distclean # コンパイルの準備 $ make cg # cg のコンパイル $ make tg # tg のコンパイル
make できたら,スクリプトを作成し実行してみよう. サンプル tg スクリプト:
実行方法:
$ ./tg スクリプト.tg | display &
実行結果:
![]() |
![]() |
![]() |
![]() |
さまざまな幾何学図形を描画するための tg スクリプトを作成せよ.
基本プログラムの状態で使えるコマンドは, forward, left, right, repeat-end だけ.
基本プログラムでは,コマンドとして forward,left,right, および repeat 〜 end の 4 つしか解釈できない. 他のコマンド(基本描画コマンド backward,pendown,penup, および初期設定コマンド goto,angle)を実装せよ.