【直線-16】交互に線幅が違う水平線を描こう

線幅の異なった水平線を条件によって処理が分かれる条件分岐構文を使って描いてみましょう。
条件分岐構文は頻繁に使いますので良く覚えましょう。
条件にはある値が正しい(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

次はmodif文を使って、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

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

コメント

コメントする

CAPTCHA


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

目次