【円弧-23】複合パストリック

下記のコードは塗りつぶしの円が重なっているだけなのに、同心円になるというコードです。
Illustratorで言うところの複合パスを使用します。
要はパスが重なった部分は、抜けて透明になるという機能です。
ここでは半径を大きくして円が重なっていますが、fillではなくeofillオペレータを使用して 重なった部分を抜いているので、同心円になるというトリックです。
eofillをfillに変えると真っ暗な円になってしまいます。


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
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 720 720
%%HiResBoundingBox: 0 0 720 720
%%CropBox: 0 0 720 720
%%Title:eofill使用で同心円
%%Creator:Studio Fruit Jam / Toyokazu Nishi
%%Copyright:Studio Fruit Jam / Toyokazu Nishi
%%CreationDate:2019年1月17日 木曜日21:44:15

% ================ 座標変換 ================
360 dup translate
1 dup scale
% ================ 背景 =================
1 1 1 setrgbcolor
-360 360 720 -720 rectfill
% ================ 定義 ================
0 0 0 setrgbcolor
/r 10 def   % 円の初期半径
/dt 20 def  % 半径の増値
% ================ メイン================
18 {    % 18回以下を繰り返す
    0 0 r 0 360 arc % 円を引く
    /r r dt add def % 半径を大きくする
} repeat
eofill  % 奇偶規則を使用し、パスの内側を塗りつぶす

次は上下左右から円を大きくした図形を描きます。
最後にstrokeしているため、余分な直線が入っています。
連続して円を引いているためパスが繋がってしまった結果です。
これはこれでeofillで塗りつぶした時に思わぬ図形になります。

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
28
29
30
31
32
33
34
35
36
37
38
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 720 720
%%HiResBoundingBox: 0 0 720 720
%%CropBox:  0 0 720 720
% コンピュータ・グラフィックス P32より
%%Title: マルチサークル10 上下左右から
%%Creator:Studio Fruit Jam / Toyokazu Nishi
%%Copyright:Studio Fruit Jam / Toyokazu Nishi
%%CreationDate2016年1月30日土曜日17:47:22
%%CreationDate:2018年5月18日金曜日午前11:49:32
%%ModificatioDate:2019年1月17日 木曜日23:30:39

% ================ 座標変換 ================
40 360 translate
1 dup scale
% ================ 背景 =================
/DeviceRGB setcolorspace        % カラースペース設定
1 1 1 setrgbcolor
-360 360 720 -720 rectfill
% ================ 定義 ================
/s 80 def       % ステップ数 最大値を割り切れる数に
/max 320 def    % 最大値

% ================ メイン================
0 0 0 setrgbcolor
newpath % パスの初期化
0 s max {
        /i exch def
        i   0   i       0 360 arc       % 左
        max max i sub i 0 360 arc       % 上
       
        max s neg 0 {
                /k exch def
                max 2 mul k sub 0 k  0 360 arc  % 右
                max max neg k add k  0 360 arc  % 下
        } for
} for
stroke
上記コードの最後のstrokeをeofillに変えると、下記のような図形となります。
冒頭の作例は上記のコードのstep数を細かくし、グラデーションを加えたものです。
【オペレータの説明】
eofill パスの内側を奇遇規則を使用して内部領域を判定し、塗りつぶす。