【直線-18】円内・円外に線を描いてみよう

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

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次