ポストスクリプトによる図化

ポストスクリプト(Postscript)はページ記述言語の一種で、強力なグラフィックス機能を備えたプログラミング言語です。
Postscriptプログラムは、対象となる値や変数などのオペランドと内容を指示するオペレータ の記述だけでよいので、図形やグラフなどの作成用のPostscriptファイルを作成するためのライブラリがfortranやC言語などで数種類公開されています。
これらのライブラリでは満足しない方や、ご自分で作成してみたい方のために、図形・グラフなどを作成するためのPostscriptファイル の記述について紹介します。

1.オペレータの概要

図形・グラフ作成などに使用する主なオペレータの概要は、次のとおりになります。

オペレータ概要
項 目オペランドとオペレータ内 容
記号説明n i j x y数値
ary配列
bool理論値
dict辞書
fdictフォント辞書
nam名前
obオブジェクト
proc手続き
str文字列
制御n proc repeatprocの手続きをn回繰り返す
座標系angle rotate原点を中心としてangle°反時計回りに回転させる
x y scale水平方向をx倍、垂直方向をy倍に拡大・縮小する
x y translate原点を(x,y)に移動する
グラフィック状態grestore対応するgsaveのグラフィック状態を回復する
gsaveグラフィック状態を保存する
グラフィック状態array n setdash破線パターンをarray[線分 間隔]の配列でオフセットnに設定する
0/1/2 setlinecapストロークされる線分の線端の形状を設定する
0:垂直切断 1:半円 2:正方形
0/1/2 setlinejoinストロークされる線分の接続部の形状を設定する
0:角度なり(マイターリミットで指定) 1:半円 2:垂直切断
num setmiterlimit最大マイターリミットを設定する
パス構築newpathカレントパスをクリアに初期化する
closepath最後のmoveto点まで直線を引き、カレントパスを閉じる
x y movetoカレント・ポイントをx,yに設定し、新しいパスを開始する
x y lineto直線をx、yまで引く
x y rmoveto相対的なmovetoを実行する
x y rlineto相対的なlinetoを実行する
x y ang1 ang2 arc反時計回りのang1°からang2°の円弧を描く
x y ang1 ang2 arcn時計回りのang1°からang2°の円弧を描く
x1 y1 x2 y2 r arcto2点を接線とする円弧を描く
currentpointカレント・ポイントの座標値を返す
strokepathパスを輪郭に変換する
clipppathカレントパスをクリッピングパスに設定する
clipワインディング規則(反対方向描画)でクリッピングパスを作成する
eoclip奇偶規則(内側図形)でクリッピングパスを作成する
x y width height rectclipx,yを始点、幅をwidth、高さをheightとする矩形をクリッピングパスに設定する
描画erasepageページ全体を消去する
stroke描画する(一つ一つの図形等の区切りに必ず入れる)
fillカラーで塗りつぶす
eofill奇偶規則(内側図形)でカラーで塗りつぶす
x y width height rectstrokex,yを始点、幅をwidth、高さをheightとする矩形を描画する
x y width height rectfillx,yを始点、幅をwidth、高さをheightとする矩形を塗りつぶす
n setgraynのグレー値に設定する(0:黒、1:白)
n setlinewidth線幅を設定する
red green blue setrgbcolorカラーをRGBで設定する
出力showpageページを出力する
辞書key value def辞書の中でkeyとvalueを対応付ける
フォントkey findfontkeyのフォント辞書を返す
fdict scalefontfdictのフォント辞書を拡大・縮小したフォント辞書を返す
fdict setfont使用するフォント辞書を設定する
str showstrの文字列を描く
str stringwidth文字列strの幅(x,y)を返す
ax ay str asshow幅をx方向にax,y方向にayだけ追加し、strの文字列を描く
cx cy char str widthshowcharの文字の幅をx方向にcx、y方向にcyだけ追加し、strの文字列を描く
cx cy char ax ay str awidthshow1回の操作でashowとwidthshowを行う

参考文献
 「PostScript チュートリアル&クックブック アスキー」
 「PostScript リファレンスマニュアル・第3版 アスキー」

2.オペレータの使用方法

postscriptファイルはテキストファイルですので、テキストエディタ(メモ帳など)を使ってオペレータを入力し、保存ファイル名を○○.psとすれば完成です。
また、作成したpostscriptファイルの図形等を表示するには、Ghostscript(GSviewとの組合せ)などのインタープリンタをお使いください。
ここでは、オペレータの例を示しますが、このオペレータをコピーしテキストエディタに貼り付け、保存したのがダウンロード用ファイルです。
コメントは%の記号で始まり、プログラム行の後ろにある場合はインタープリンタでは無視されます。

描画する場合には、複数のオペレータを組合せることになりますが、ここでは図形・グラフなどで用いられる項目について、その使用方法を紹介します。

使用方法一覧
(1)基本単位 
(2)直線の描画@直線の描画
A線の種類
B線の幅
(3)連続線の描画@連続線の描画
A多角形の描画
B四角形の描画
(4)色と塗りつぶし@白黒の設定
Aカラーの設定
(5)円弧の描画@円弧の描画
A2点を接線とする円弧の描画
(6)原点移動・座標軸の回転・拡大縮小@原点移動
A座標軸の回転
B拡大縮小
(7)文字の描画@欧文フォント
A日本語フォント
(8)手続きの定義@演算定義
A動作定義

(1) 基本単位

postscriptの基本単位は1/72インチ(相当)=1ポイント、X・Y座標値、線の種類・太さ、文字の大きさなどをポイントで指定します。
  1ポイント=1/72インチ(相当)=25.4mm/72=0.3528mm(相当)
    注意:相当は厳密ではなくおおよその意味です。

(2) 直線の描画

@ 直線の描画

1本の直線を描画するには、始点(moveto)と終点(lineto)を指定し、描画(stroke)、出力(showpage)の4行の構成となります。
この例は絶対座標での描画のmoveto、linetoを使用していますが、相対座標での描画ではrmoveto、rlinetoを用います。

直線の描画例

100 500 moveto  % カレントポイント(現在位置)を(100,500)にする(1点目)
500 500 lineto   % (500,500)まで直線を引く(2点目:長さ400の直線)
storke         % 直線を描画する(ここまでが直線の描画)
showpage       % ページを出力する

2_1_line.ps

使用方法一覧へ戻る

A 線の種類

線の種類には、実線、破線、一点鎖線などがありますが、線の種類の設定は、setdashで行います。
setdashでは線の種類を破線パターン[線分間隔]の配列(実線、空線の順)で自由に設定し、線描画位置を破線パターンのうちのどこから開始するかをオフセットで設定します。
なお、カレントパスでは実線が設定されていますので、setdashを指定するまでは実線で描かれます。

線の種類の例

[] 0 setdash        % 実線、オフセット0
[2 2] 2 setdash       % 破線、オフセット2
[8 1 1 1] 5 setdash    % 一点鎖線、オフセット5
[7 1 1 1 1 1] 6 setdash % 二点鎖線、オフセット6

例を次に示しますが、わかりやすいように空行で分割しています。
記述の際には分割する必要はありませんが、インタープリンタでは空行は無視されます。

線の種類描画例

[] 0 setdash           % 実線、オフセット0
100 500 moveto
250 500 lineto
strokebsp            % 1本目の直線の描画

[5 5] 3 setdash        % 破線、オフセット3
100 475 moveto
250 475 lineto
stroke               % 2本目の直線の描画

[16 2 2 2] 10 setdash    % 一点鎖線、オフセット10
100 450 moveto
250 450 lineto
stroke               % 3本目の直線の描画

[14 2 2 2 2 2] 16 setdash % 二点鎖線、オフセット16
100 425 moveto
250 425 lineto
stroke               % 4本目の直線の描画

[] 0 setdash
100 425 moveto
100 500 lineto
250 425 moveto
250 500 lineto
stroke               % 縦線の描画
showpage

2_2_line-type.ps

使用方法一覧へ戻る

B 線の幅

線の幅はsetlinewidthで設定します。

線の幅描画例

100 500 moveto
500 500 lineto
5 setlinewidth  % 線幅= 5ポイント
stroke
showpage

2_3_line-width.ps

使用方法一覧へ戻る

(3) 連続線の描画

@ 連続線の描画

連続線を描画するには、始点(moveto)のつぎに各点(lineto:点の数分)を指定します。

連続線の描画例

100 500 moveto % 1点目(始点)
150 550 lineto  % 2点目
180 480 lineto  % 3点目
260 400 lineto  % 4点目
320 600 lineto  % 5点目
420 420 lineto  % 6点目
500 100 lineto  % 7点目
stroke
showpage

3_1_continuous-line.ps

使用方法一覧へ戻る

A 多角形の描画

多角形は連続線の終端を閉じたものになりますので、閉じる=closepath を最後に付ければ描画されます。
上記の連続線を閉じる場合は、最後のlinetoの後にclrosepathを記述します。

多角形の描画例

100 500 moveto % 1点目(始点)
150 550 lineto  % 2点目
180 480 lineto  % 3点目
260 400 lineto  % 4点目
320 600 lineto  % 5点目
420 420 lineto  % 6点目
500 100 lineto  % 7点目
clrosepath     % 閉じる
stroke
showpage

3_2_polygon.ps

使用方法一覧へ戻る

B 四角形の描画

四角形の描画には、多角形あるいは矩形としての描画方法があります。

四角形の描画例
多角形としての描画

100 100 moveto % 1点目(始点)
140 100 lineto  % 2点目
140 140 lineto  % 3点目
100 140 lineto  % 4点目
closepath      % 閉じる
stroke
showpage

矩形としての描画

150 100 40 40 rectstroke % 150,100を始点、幅を40、高さ40とする矩形を描画する
stroke
showpage

3_3_quadrangle.ps

使用方法一覧へ戻る

(4) 色と塗りつぶし

@ 白黒の設定

白黒の設定は、setgray によって、0:黒、1:白、中間は中間値(小数)で度合いを設定します。
塗りつぶすには、fillを付けます。

白黒の設定と塗りつぶしの例

300 100 moveto
340 100 lineto
340 140 lineto
300 140 lineto
closepath
0.25 setgray   % 白黒の度合いを0.25に設定
fill
stroke
showpage

4_1_mono-paint.ps

使用方法一覧へ戻る

A カラーの設定

カラーの設定は、setrgbcolor によって、RGBのそれぞれの率で設定します。
 主なカラー
0 , 0 , 0 :黒  0 , 1 , 0 :緑  0 , 1 , 1 :シアン  1 , 0 , 0 :赤
1 , 1 , 0 :黄  0 , 0 , 1 :青  1 , 0 , 1 :マゼンダ 1 , 1 , 1 :白

カラーの設定と塗りつぶしの例

300 100 moveto
340 100 lineto
340 140 lineto
300 140 lineto
clrosepath
1.0 0.0 0.0 setrgbcolor  % カラーを赤に設定(R=1.0 , G=0.0 , B=0.0)
stroke
showpage

4_2_color-paint.ps

使用方法一覧へ戻る

(5) 円弧の描画

@ 円弧の描画

円弧の描画には、描画方向によって、反時計回り:arc 時計回り:arcn の2種類があります。

反時計回りの例

100 100 150 2 36 arc  % 中心点100,100 半径150 角度2 〜 36°の円弧を描画する
stroke
showpage

時計回りの例

100 100 150 36 2 arcn  % 中心点100,100 半径150 角度36 〜 2°の円弧を描画する
stroke
showpage

5_1_arc.ps

使用方法一覧へ戻る

A 2点を接線とする円弧の描画

円弧(arct)は接線との組み合わせて描画します。

2点を接線とする円弧の描画例

150 50 moveto         % 接点1まで直線を描画する
150 300 300 300 150 arct % 接点1:150,300 接点2:300,300 半径150の円弧を描画する
400 300 lineto         % 接点2から直線を描画する
stroke
showpage

5_2_2tan-arc.ps

使用方法一覧へ戻る

(6) 原点移動・座標軸の回転・拡大縮小

@ 原点移動

原点を移動する場合には、translateによって相対的な位置を指定する。

原点移動例

150 100 40 40 rectstroke % 150,100を始点、幅を40、高さ40とする矩形を描画する
20 20 translate         % 原点を20,20移動する
150 100 40 40 rectstroke
30 30 translate         % 原点を30,30移動する
150 100 40 40 rectstroke
60 60 translate         % 原点を60,60移動する
150 100 40 40 rectstroke
stroke
showpage

6_1_origin-shift.ps

使用方法一覧へ戻る

A 座標軸の回転

座標軸の回転は、rotateによって原点を中心とした反時計回りに回転させる。

座標軸の回転例

150 100 40 40 rectstroke % 150,100を始点、幅を40、高さ40とする矩形を描画する
5 rotate             % 座標軸を5度、反時計回りに回転させる
150 100 40 40 rectstroke
10 rotate             % 座標軸をさらに10度、反時計回りに回転させる
150 100 40 40 rectstroke
15 rotate             % 座標軸をさらに15度、反時計回りに回転させる
150 100 40 40 rectstroke
stroke
showpage

6_2_rotation-of-axis.ps

使用方法一覧へ戻る

B 拡大縮小

拡大縮小する場合には、scale によって水平方向をx倍、垂直方向をy倍に拡大・縮小する。

拡大縮小例

150 100 40 40 rectstroke  % 150,100を始点、幅を40、高さ40とする矩形を描画する
0.5 1.0 scale           % 水平方向0.5倍、垂直方向1.0倍にする
150 100 40 40 rectstroke
2.0 0.5 scale           % さらに、水平方向2.0倍、垂直方向0.5倍にする
150 100 40 40 rectstroke
2.8 2.8 scale           % さらに、水平方向2.8倍、垂直方向2.8倍にする
150 100 40 40 rectstroke
stroke
showpage

6_3_exp-red.ps

使用方法一覧へ戻る

(7) 文字の描画

文字の描画は、フォントと文字の大きさを設定し、開始位置と文字列を指定します。

@ 欧文フォント

欧文フォントとしては、Timesファミリ、Helveticaファミリ、Courierファミリが最もポピュラーです。
Timesファミリは日本語の明朝体に、Helveticaファミリはゴシック体に相当し、プロポーショナル(文字によって横幅が異なる。)なフォントで、Courierファミリは等幅フォントです。

欧文フォントの例

/Times-Roman findfont 10 scalefont setfont       % Times-Romanの10ポイントに設定する
200 700 moveto                           % 文字列開始位置
(Times-Roman postscript) show                % ( )内の文字列を描画する
/Times-Italic findfont 10 scalefont setfont        % Times-italicの10ポイントに設定する
200 680 moveto
(Times-Italic postscript) show
/Times-Bold findfont 10 scalefont setfont        % Times-Boldの10ポイントに設定する
200 660 moveto
(Times-Bold postscript) show
/Times-BoldItalic findfont 10 scalefont setfont     % Times-BoldItalicの10ポイントに設定する
200 640 moveto
(Times-BoldItalic postscript) show

/Helvetica findfont 10 scalefont setfont          % Helveticaの10ポイントに設定する
200 600 moveto
(Helvetica postscript) show
/Helvetica-Oblique findfont 10 scalefont setfont    % Helvetica-Obliqueの10ポイントに設定する
200 580 moveto
(Helvetica-Oblique postscript) show
/Helvetica-Bold findfont 10 scalefont setfont      % Helvetica-Boldの10ポイントに設定する
200 560 moveto
(Helvetica-Bold postscript) show
/Helvetica-BoldOblique findfont 10 scalefont setfont % Helvetica-BoldObliqueの10ポイントに設定する
200 540 moveto
(Helvetica-BoldOblique postscript) show

/Courier findfont 10 scalefont setfont            % Courierの10ポイントに設定する
200 500 moveto
(Courier postscript) show
/Courier-Oblique findfont 10 scalefont setfont      % Courier-Obliqueの10ポイントに設定する
200 480 moveto
(Courier-Oblique postscript) show
/Courier-Bold findfont 10 scalefont setfont        % Couriera-Boldの10ポイントに設定する
200 460 moveto
(Courier-Bold postscript) show
/Courier-BoldOblique findfont 10 scalefont setfont   % Courier-BoldObliqueの10ポイントに設定する
200 440 moveto
(Courier-BoldOblique postscript) show
showpage

7_1_roman-character.ps

使用方法一覧へ戻る

A 日本語フォント

日本語フォントとしては、明朝体:Ryumin-Light-H とゴシック体:GothicBBB-Medium-H があります。
日本語フォントの場合、文字をJISコードで指定する必要があり、( ) show の場合には8進数、< > show の場合には16進数でしていします。

日本語フォントの例

 8進数指定:文字=「8進数」
/Ryumin-Light-H findfont 10 scalefont setfont     % Ryumin-Light-Hの10ポイントに設定する
200 700 moveto                          % 文字列開始位置
(\043\070\077\112\077\164) show             % ( )内の文字列を描画する:8進数

 16進数指定:文字=「16進数」
/GothicBBB-Medium-H findfont 10 scalefont setfont % GothicBBB-Medium-Hの10ポイントに設定する
200 680 moveto
<2331 2336 3F4A 3F74> show                 % ( )内の文字列を描画する:16進数
showpage

7_2_japanese-character.ps

使用方法一覧へ戻る

(8) 手続きの定義

手続きの定義は、" / 手続きの名前 { 手続きを構成する一連の演算や動作 } def " で構成されます。

@ 演算定義

演算には、 add:足し合せ、sub:引く、div:割る、idiv:割り算の商の整数部のみをとる、mod:割り算の余り、mul:かけ合わせ、neg:数値の反転 があります。

cm単位指定の例

演算定義例として座標値等をセンチメータ(cm)単位で指定し、内部でポイントに変換させる例です。
手続きの名前をcm、cm があれば、その前の値に 28.34645669 を乗じた値(ポイント)とする場合

/cm {28.34645669 mul } def
3 cm 3 cm moveto  % 座標値 3×28.34645669 , 3×28.34645669
8 cm 3 cm lineto   %      8×28.34645669 , 3×28.34645669
8 cm 12 cm lineto  %      8×28.34645669 , 12×28.34645669
3 cm 12 cm lineto  %      3×28.34645669 , 12×28.34645669
clrosepath
stroke
showpage

8_1_unit-of-cm.ps

使用方法一覧へ戻る

A 動作定義

★マークの描画の例

動作定義例として、★マークの描画動作を定義しておき、それを呼び出し描画する例です。

/starf           % 動作定義の名前
{ 0 0.5 rmoveto    % ★マークの座標値
0.105 -0.35 rlineto
0.36 0.0 rlineto
-0.3 -0.21 rlineto
0.1 -0.35 rlineto
-0.27 0.205 rlineto
-0.27 -0.205 rlineto
0.1 0.35 rlineto
-0.3 0.21 rlineto
0.36 0.0 rlineto
closepath
fill
} def            % 動作定義の終了行
 
300 300 moveto    % 描画する位置
100 100 scale     % 描画する倍率(x,y)
starf            % 動作定義の呼び出し
stroke
showpage

8_2_operation-definition.ps

使用方法一覧へ戻る