線幅の異なった水平線を条件によって処理が分かれる条件分岐構文を使って描いてみましょう。
条件分岐構文は頻繁に使いますので良く覚えましょう。
条件にはある値が正しい(true)か違っている(false)、ある値より大きい/小さい/等しいなどがあります。これらを使用して処理を分岐します。
今回は線幅を交互にするためにsw(switchの略)という変数を用意し、 /sw sw neg def で交互に符号を反転させます。(-1,1,-1,1,…)
トグルスイッチのイメージです。
swが1の時に線幅を5ポイントにし、それ以外(-1)の時には1ポイントにします。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 %!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 240 240
%%Title:交互に水平線を描く
/x 100 def % x座標
/sw 1 def % 切替スイッチ
120 120 translate % 座標の原点を中央に移動
newpath % パスの初期化
0 10 100 { % -100から20づつ増やし100になるまで{ }内を繰り返す
/y exch def % 制御変数をy(y座標)に入れる
% swが1なら線幅を5ポイント、それ以外なら1ポイントにする
sw 1 eq {5 setlinewidth } {1 setlinewidth} ifelse
x neg y moveto % 始点へ移動
x 2 mul 0 rlineto % 始点と終点の間にパスを引く
stroke % 線を描画する
/sw sw neg def % swの符号を反転してswに入れる
} for
次はmodとif文を使って、3本目の線を太くします。
制御変数yを3で割った余りが0の場合だけに線幅を5ポイントにします。
-1,-2,0,-1,-2,0,…と0が3番目に現れます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 %!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 240 240
%%Title:交互に水平線を描く
x 100 def % x座標
120 120 translate % 座標の原点を中央に移動
newpath % パスの初期化
0 10 100 { % -100から20づつ増やし100になるまで{ }内を繰り返す
/y exch def % 制御変数をy(y座標)に入れる
/h y 3 mod % yを3で割った余りをhに入れる
h 0 eq {5 setlinewidth } if % hが0なら線幅を5ポイントにする。
x neg y moveto % 始点へ移動
x 2 mul 0 rlineto % 始点と終点の間にパスを引く
stroke % 線を描画する
1 setlinewidth % 線幅を1ポイントにする
} for
【オペレータの説明】
論理値 {プロシージャ1} {プロシージャ2 } ifelse | 論理値がtrue(真)ならプロシージャ1を、false(偽)ならプロシージャ2を実行する。 |
論理値 {プロシージャ} if | 論理値がtrueならプロシージャを実行する。 |
任意値1 任意値2 eq | スタックから2つの値を取り出し、等しければtrueを、そうでなければfalseを返す。 記号で言えば=(EQUALS) 2.0 2 eq → true /k 5 def k 2 eq → false |
任意値1 任意値2 ne | スタックから2つの値を取り出し、等しければfalseを、そうでなければtrueを返す。 記号で言えば≠(NOT EQUAL TO) 2.0 2 ne → false /k 5 def k 2 ne → true |
数値1 数値2 ge | スタックから2つの値を取り出し、数値1が数値2と同じかそれ以上ならtrueを、そうでなければfalseを返す。 記号で言えば≧(GREATER-THAN OVER EQUAL TO) 2 1 ge → true /k 5 def k 8 ge → false |
数値1 数値2 le | スタックから2つの値を取り出し、数値1が数値2と同じかそれ以下ならtrueを、そうでなければfalseを返す。 記号で言えば≦(LESS-THAN OVER EQUAL TO) 2 1 le → false /k 5 def k 8 ge → true |
数値1 数値2 gt | スタックから2つの値を取り出し、数値1が数値2以上ならtrueを、そうでなければfalseを返す。 記号で言えば>(GREATER-THAN) 2 1 gt → true /k 5 def k 8 gt → false |
数値1 数値2 lt | スタックから2つの値を取り出し、数値1が数値2以下ならtrueを、そうでなければfalseを返す。 記号で言えば<(LESS-THAN) 2 1 lt → false /k 5 def k 8 lt → true |
コメント