2011年12月27日火曜日

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

またまたpostscriptプログラミング。とにかく、これはおもしろい。デカルトにプレゼントしたい気分。

今回は、渦巻きを描いてみる。こんな感じ。
半円を滑らかに繋いで作ったスパイラル図形
まずナイーブに書くとこんな感じ。
%PS-Adobe-3.0
newpath
3 setlinewidth
295 300  5  0   180 arc stroke
300 300 10  180 360 arc stroke
290 300 20  0   180 arc stroke
310 300 40  180 360 arc stroke
270 300 80  0   180 arc stroke
350 300 160 180 360 arc stroke
190 300 320 0   180 arc stroke
showpage
変数を使って、もう少し賢くやってみた。

スタックを使ってコンパクトにやろうと思ったのだが、まだ慣れてないのがよくわかった。エラーが出てばかりで前に進めなかったので、変数を使いまくることにした。ちょっと汚いが一応動いたので、ここにメモっておく。

%PS-Adobe-3.0
newpath
5 setlinewidth
/x0 400 def
/y0 300 def
/x 0 def
/radius 2 def
/sgn -1 def
/a0 0 def
/a1 180 def
x0 y0 radius a0 a1 arc stroke
1 1 8 {
    /n exch def
    /nradius radius sgn mul def
    /x x nradius add def
    /xx x 400 add def
    /a0 n 2 mod 180 mul def
    /a1 a0 180 add def
    /radius radius 2 mul def
    xx y0 radius a0 a1 arc stroke
    /sgn sgn -1 mul def
} for
showpage
 defの使い方をマスターして、変数が使えるようになったのは大きい。defにするとスタックに入らないということだ。

/a0 n 2 mod 180 mul def
の意味は、「a0に、n割った余り180かけたものをしまう」となる。まさに日本語の順番!

また、繰り返し(for)は、1 2 3 {...} forとやる。これは、「1から2おきに3まで繰り返し」と読む。このとき走るダミー添字には変数が付かない。(C++やJavaだと for(int i=1; i<=3; i +=2)などと書いて、ダミー添字iを導入する。)代わりに、スタックにダミー添字の値が入る。添字の内容が必要ない時はexchしてとりだしてしまう。1 2 3 {} forと、1 2 3{/n exch def} forとを比べてみれば一目瞭然。gsのプロンプトでの例は下。


GS>1 2 3 {} for
GS<2>pstack
3
1
GS<2>clear
GS>1 2 3 {/n exch def} for
GS>pstack
GS>




0 件のコメント: