So-net無料ブログ作成
検索選択

三角形を描く [PostScript]

三角形・多角形を描く

Postscriptで正三角形を描いてみましょう。sin(60)×一辺の長さでy座標を得ます。


05-01三角形.png
【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:三角形を描く 120 70 translate % 座標を移動 newpath % パスの初期化 -50 0 moveto % 底辺を引く 50 0 linneto % 0,sin(60)×100に線を引く 0 60 sin 100 mul lineto closepath % 線を繋げる stroke % 描画する

次の方法は正三角形の高さを求める公式 高さ=1辺の長さ×√3÷2 を使用します。
図は同じになるので省略します。

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:三角形を描く 120 70 translate % 座標を移動 newpath % パスの初期化 -50 0 moveto % 始点を移動 50 0 lineto % 始点と終点の間にパスを引く -50 50 3 sqrt mul rlineto % -50 ,(100÷2)×√3に線を引く closepath % 線を繋げる stroke % 描画する


【オペレータの説明】
角度 sin指定の角度の正弦値(実数)を返す。単位は度
数値1 数値2 mul数値1に数値2を掛けた積を返す
数値 sqrt数値の平方根(実数)を返す。

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

交互に線幅が違う水平線を描く [PostScript]

直線を描く PART2


20-04水平線.png
線幅の異なった水平線を制御構文を使って描いてみましょう。
制御構文は頻繁に使いますので良く覚えましょう。
交互にするためにsw(switchの略)という変数を用意し、 /sw sw neg def で交互に符号を反転させます。(-1 1 -1 1....)トグルスイッチのイメージです。
swが1の時に線幅を5ポイントにし、それ以外(-1)の時には1ポイントにします。

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

20-05.png
modとif文を使って、3本目の線を太くします。
制御変数yを3で割った余りが0の場合だけに線幅を5ポイントにします。

【サンプルコード】
%!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に入れる(-1 -2 0 -1 -2 0と0が3番目に現れる) 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


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