

円を並べてパターンを作ってみようと配列とrandの応用で円にランダムに4色を割り当てます。
カラー配列を4個用意し、col配列に入れておきます。
/col [ [ 0 0 1 ] [ 0 .8 1 ] [ .8 0 1 ] [ .5 .5 1 ] ] def
そこからランダムに0から3が返るので(rand 4 mod)、それをindexとしてcol配列からカラー配列を取り出します。(get)
配列の全要素をスタックに置きます。(aload)
不要なオペランドも置かれますので削除します。(pop)
置かれた値でカラーを設定します。(setrgbcolor)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:円のパターン /r 10 def % 円の半径 /step 20 def % 円と円の間隔 /h 120 r add def % 高さ(パターンが端で不完全にならないよう円の半径分足す) /w 120 r add def % 幅(パターンが端で不完全にならないよう円の半径分足す) % 幅・高さを間隔で割って余りをkx、kyに入れる %(パターンを天地左右対象に囲みに入れるため) /kx w step mod def /ky h step mod def /col [ [ 0 0 1 ] [ 0 .8 1 ] [ .8 0 1 ] [ .5 .5 1 ] ] def % カラー配列を作る 120 120 translate % 座標の原点を中央に移動 newpath % パスの初期化 w neg step w { % -120から30づつ増やし120になるまで { }を繰り返す /dx exch def % 制御変数をdxに入れる h neg step h { % -120から30づつ増やし120になるまで { }を繰り返す /dy exch def % 制御変数をdyに入れる % 0〜3のランダムな値(rand 4 mod)で配列colからカラー配列を取り出し(get)、 % スタックに置き(aload)、オペランドは削除(pop)して % カラー設定する(setrgbcolor) col rand 4 mod get aload pop setrgbcolor % dx,dyが中心の半径10の円を描く(kx、kyの余りを足して位置の調整) dx kx add dy ky add r 0 360 arc stroke } for } for |
【オペレータの説明】
整数 array | 整数個の要素の配列を作成します。初期値で空要素nullが入ります 他の要素で置き換える場合はcopy等を使用します (例) 3 array → [-null- -null- -null-] /x 3 array def → [-null- -null- -null-] ※ 配列の長さは可変長にできません。(追加・削除・挿入ができない) ただし置き換えはできます |
[ 要素 ] | 配列を作成します (例) [ 1 2 3 4 5 ] → [ 1 2 3 4 5 ] /x [ 1 2 3 4 5 ] def → [ 1 2 3 4 5 ] |
配列 index get | 配列からindex番目の要素を返します (例)/x [ 1 2 3 4 5 ] def x 3 get → 4 0番から始めて3番目の4が返る (例)/x [[ 1 2 3 4 5 ][ 6 7 8 9 10 ]] def x 1 get → [ 6 7 8 9 10 ] 1番目の配列が返る |
配列 aload | 配列の全要素をスタックに格納します (例)/x [ 1 2 3 4 5 ] def x aload → [ 1 2 3 4 5 ] 5 4 3 2 1 配列から要素をスタックにプッシュした後、配列そのものもプッシュする 配列が不要な場合はpop(削除)する → 5 4 3 2 1 |
配列 length | 配列の要素数を返します (例)/x [ 1 2 3 4 5 ] def x length → 5 |
配列 index 要素2 put | 配列からindex番目の要素を要素2で置き換えます (例)/x [ 1 2 3 4 5 ] def x 3 (abc) put → [ 1 2 3 (abc) 5 ] 0番から始めて3番目の4が(abc)に置き換わる |
配列1 配列2 copy | 配列1の要素を配列2の部分配列にコピーします(置換する) (配列1より配列2の要素が少ないとエラー) (例)/a [ 1 2 3 4 5 ] def /b [ null null null null null 6 7 ] def a b copy → [ 1 2 3 4 5 6 7 ] |
コメント