postscript languageでは曲線を描くコマンドはない。
従って、短い直線をつなぎ合わせることで、近似的な曲線を描く手法をまずは採用してみよう。 意外に目を騙す事は可能であることを知るだろう。
%! PS-adobe-3.0
newpath
/x0 100 def
/y0 500 def
/xo 0 def
/a 100 def
/b 2 def
xo x0 add xo b mul sin a mul y0 add moveto
0 1 400{
/dx exch def
/xi xo dx add def
xi x0 add xi b mul sin a mul y0 add lineto
} bind for
stroke
showpage
/x0 100 defの部分は、印字用紙の絶対座標(x0,y0)を、 相対座標の原点とするための定義部分。 相対座標xiは、描画座標x = xi + x0に変換される。
xoは相対座標における初期値。ここから描画を始める。このスクリプトでは原点に セットされている。a,bはそれぞれ振幅と周波数。 f(x) = a * sin(b*xi)という関係。postscriptでは、この代数計算はxi b mul sin a mulと表す。
最初のmovetoで,(xo+x0, a sin(b*xo) + y0)に始点がセットされる。
bind forではdxが0から400まで1刻みで変化するようにループが
セットされる。次の文で、相対座標はxi= xo + dxと定義されている。
linetoでは(xo,yo)-(xi,yi)の間に直線が引かれるが、その刻み幅dxは1に
してあるため、見た目には滑らかに変化しているように見える。
次は、パラメータ表示によって、リサジュー図形を描いてみよう。
%! PS-adobe-3.0
newpath
/x0 150 def
/y0 500 def
/xo 0 def
/a 100 def
/b1 3 def
/b2 5 def
xo b1 mul cos a mul x0 add xo b2 mul sin a mul y0 add moveto
0 1 400{
/dx exch def
/xi xo dx add def
xi b1 mul cos a mul x0 add xi b2 mul sin a mul y0 add lineto
} bind for
stroke
showpage
周波数の比はb1/b2 = 3/5にした。
上のスクリプトで、周波数を大きくしてやると、網篭のような図形ができる。 b1:b2=13:15の場合。