

円の中や外に平行線(万線)を描きます。
円の方程式(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 で初期化が必要です。 |
コメント