円の中や外に平行線(万線)を描きます。
円の方程式(x2+y2=r2)を使い、線が円内に入っているかどうかを判別します。
円内に入っていればdrawlineプロシージャを呼び出して線を引きます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 %!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 240 240
%%Title:円内に線を描く
/r 90 def % 円の半径
/sw 0 def % movetoを1回だけ使用するスイッチ
/drawline { % ラインを描くプロシージャ
sw 0 eq { x y moveto /sw 1 def } { x y lineto } ifelse
} def
120 120 translate % 座標の原点を中央に移動
newpath % パスの初期化
% -100から3づつ増分しながら100まで{ }内を繰り返す
-100 3 100 {
/x exch def %制御変数をx座標に入れる
% -100から1づつ増分しながら100まで{ }内を繰り返す
-100 1 100 {
/y exch def %制御変数をy座標に入れる
% x^2+y^2がr^2より小さいか同じならdrawlineを呼び出す
x 2 exp y 2 exp add r 2 exp le {drawline} if
} for
/sw 0 def % これがないと線が繋がるのでリセットが必要
} for
stroke % 描画する
次は逆に円外に線を描いてみます。
ifelse文に/sw 0 defがないと円内でも線が繋がってしまいます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 %!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 240 240
%%Title:円外に線を描く
/r 90 def % 円の半径
/sw 0 def % movetoを1回だけ使用するスイッチ
/drawline { % ラインを描くプロシージャ
sw 0 eq { x y moveto /sw 1 def } { x y lineto } ifelse
} def
120 120 translate % 座標の原点を中央に移動
newpath % パスの初期化
% -100から3づつ増分しながら100まで{ }内を繰り返す
-100 3 100 {
/x exch def %制御変数をx座標に入れる
% -100から1づつ増分しながら100まで{ }内を繰り返す
-100 1 100 {
/y exch def % 制御変数をy座標に入れる
% x^2+y^2がr^2より大きいか同じならdrawlineを呼び出す
x 2 exp y 2 exp add r 2 exp ge {drawline} {/sw 0 def} ifelse
} for
/sw 0 def % これがないと線が繋がるのでリセットが必要
} for
stroke % 描画する
次は別のオペレータを使って、円内に線がある図形を描きます。
clipを使い、円で水平線をマスクします。
マスクする図形をマスクされる図形の前に記述します。
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 240 240
%%Title:線をクリップする
/r 90 def % 円の半径
/sw 0 def % movetoを1回だけ使用するスイッチ
/drawline { % ラインを描くプロシージャ
sw 0 eq { x y moveto /sw 1 def } { x y lineto } ifelse
} def
120 120 translate % 座標の原点を中央に移動
newpath % パスの初期化
0 0 r 0 360 arc clip % 半径rの円で図形をクリップする
newpath % パスの初期化
% -100から3づつ増分しながら100まで{ }内を繰り返す
-100 3 100 {
/y exch def %制御変数をy座標に入れる
% -100から1づつ増分しながら100まで{ }内を繰り返す
-100 1 100 {
/x exch def % 制御変数をx座標に入れる
drawline % drawlineを呼び出す
} for
/sw 0 def % これがないと線が繋がるのでリセットが必要
} for
stroke % 描画する
【オペレータの説明】
基数 指数 exp | 基数の乗数を返す 例)3 3 exp →33(または3^3)=27 |
clip | クリップ領域を設定する newpath で初期化が必要です。 |
コメント