これまで作成してきたプログラム 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 のディレクトリへ移動しよう. そして,そのディレクトリに,次のソースファイルをダウンロードしよう.
このままでは,まだ,コンパイルできないかもしれない. 各自の分割状況に適合するように, tg.c の内容(ヘッダファイル名,関数名,等) を修正する必要があるだろう. 参考のため,元々の tg.c で仮定しているヘッダファイルの内容を 次に示しておく:
前回までに作成した分割ソース(ヘッダファイルやソースファイル)の内容については 変更しないこと. 今回のソースファイル tg.c だけを変更すること.
また,コンパイルするために, すでに作成済みの Makefile の内容も修正しよう. オブジェクトファイル tg.o およびプログラムファイル tg をターゲットとして エントリを追加:
all: cg tg # これもあると便利かも(make だけですべてコンパイル) tg: tg.o pbm.o draw.o ... # 依存ファイル名については各自変更必要 cc tg.o ... tg.o: tg.c pbm.h draw.h ... # 依存ファイル名については各自変更必要 cc -c tg.c ... cg: cg.o ... cc cg.o ... ... distclean: -rm cg tg # これも追加必要
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)を実装せよ.