So-net無料ブログ作成

円内・円外に線を描いてみよう [PostScript]

直線を描く PART2


円内にあるか判別.png
円の方程式(x^2+y^2=r^2)を使い、線が円内に入っているかどうかを判別します。
円内に入っていればdrawlineを呼び出して線を引きます。

【サンプルコード】
%!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 % 描画する

円外にあるか判別2.png
次は逆に円外に線を描いてみます。
ifelse文に/sw 0 defがないと円内でも線が繋がってしまいます。

【サンプルコード】
%!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 % 描画する

円内にあるか判別c.png
次は別のオペレータを使って、円内に線がある図形を描きます。
clipを使い円で水平線をマスクします。
マスクする図形をマスクされる図形の前に記述します。

【サンプルコード】
%!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 →3^3=27
clipクリップ領域を設定する newpath で初期化が必要です。

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:アート

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました