2011年12月27日火曜日

postscriptのプログラミング(2)

調子づいてpostscriptの続きをやろう。しかし、さっそくつまずいた。変数の扱いだ。

例をまずやってみよう。次の図形を描くことを考える。
問題となるのはAの座標計算。普通に書くと(r cosθ, r sinθ)となる。原点Oが(x0,y0)にある時は、平行移動して(X,Y)=(r cosθ + x0, r sinθ + y0)となる。
最終目標は、(X,Y)から(x0,y0)まで線分を引くこと。しかし、直接座標の計算式をコマンドの引数部分におくことができないので、普通の言語ならいったんは仮変数(X,Y)などに入れてから、
X Y moveto x0 y0 lineto
などとやりたい。ここで悩んだのがX = r * cos(θ) + x0のような代入文をpostscriptではどうやって実現するのだろうかという点? 
実は、postscriptには変数の概念がない(まったくないわけではないが)。代わりにスタックを使う。言い換えれば、デフォルトで一種類の一次元配列が準備されているのはよいのだが、それしか使えないのである。しかも、ポインタと違って、アドレスによってスタックをランダムにアクセスすることができない。メモリー管理はかなり不便に感じる。


まずはX, Yの座標計算は次のように行う。
θ cos r mul x0 add θ sin r mul y0 add


どこにもデータをしまう変数の名前がないじゃないか?と正直思った。実は、結果はすべてスタックに(順番に)しまわれてuniqueに決まるため、いちいち変数を宣現したり、代入したりする必要はない。すべての計算結果は、順番にスタックにしまわれる。上の計算ではスタックに結果が2つ入る。深いほうから、X, Yとなる。スタックからのデータの取り出しは、浅い順になるので、
/y exch def /x exch def
と書く必要がある。順番を間違えると違う点(Y,X)になってしまう。また、exchすると一番上の情報がスタックから抜けて、スタックの階層が一段上がる。


こういう計算をやって最後に
x y moveto
....
などとすれば「変数」が使えたことになる。

図形中の文字は、Mac OS Xならばpreviewで開き、その機能の一つである「注釈」を利用して文字を置いていくのが一番効率がいい。結果は、printにしてpostscriptで印字する、とやればよい。

実際のプログラムを書くと次のようになる。(文字を除く。)

%PS-adobe-3.0
newpath
50 cos 400 mul 100 add 50 sin 400 mul 300 add
/y exch def /x exch def
x y moveto to 100 300 lineto 500 300 lineto stroke
100 300 120 0 50 arc stroke
showpage
 あとはpreviewで開いて、文字を付けるだけ。

文法は日本語に近い感じ。例えば、3行目なんか、「50度をcosにいれて、400を掛けてから100を足して」といった具合。ファイヤーフォックスはロシア語でないと動かないのを思い出した。postscriptは日本語で考えて組むのである!(注:ブラウザのfirefoxではなく、クリントイーストウッドのファイヤーフォックスである。)

0 件のコメント: