【パターン-5】円を並べてパターンを作ってみよう2

円を並べてパターンを作ってみよう配列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 ]