コンピュータ基礎I(PostScript)

コンピュータ基礎Iで学んだPostScriptについてまとめておきます。

一部の課題にも関係しますが、調べるとあまり情報が出てこなかったので、必要だと感じた部分は後でもわかるように、情報をまとめておきます。
手でスクリプトを打ち込むようなことは無いと思いますが、もしEPSファイルを出力するプログラムを作るようなことになったら役立つと思います。

PostScriptを打ち込んでEPSファイルを作ることができます。 メモ帳などのテキストエディタに打ち込み、保存時に拡張子を.epsにするだけで作成が可能ですが、表示するためにはillustratorなどのアプリケーションが必要です。

基本的な書き方

基本構造部分

epsファイルとして開けるようにするために、いくつか必須部分があります。

  • 1行目には必ず「%!PS-Adobe-3.0 EPSF-3.0」コメントが必要です
  • BoundingBoxコメントを使って作る必要があります

BoundingBoxは、実際の画像がページ上のどこにあるかを示すために使用されるということですが、あまりよく理解できていません。

%%BoundingBox: 72 150 144 170

と書かれている場合は、そのファイルの画像は左下(72, 150)と右上(144, 170)の座標で作られる矩形の中に画像があることを表しているということです。
講義では%%BoundingBox: 0 0 595 842としていたので、とりあえずこの数値を使います。

コメントを残したい場合、%をコメントアウトとして使用できます。%より右にあるものはコメントとなるので、プログラムには影響しません。

%!PS-Adobe-3.1 EPSF-3.0
%%BoundingBox: 0 0 595 842

%コメント

%描画部分

図形描画の方法

図形を描く場合は、座標を指定してきパスを繋いでいきます。最後にそのパスに沿って、線を引いたり塗りつぶしたりします。 具体的な方法としては、newpathで線の書き始めを宣言します。そのあとにパスを繋いでいき、strokeでパスに沿って線を引きます。 座標は左下が(0 , 0)で、縦方向がy、横方向がxです。

%!PS-Adobe-3.1 EPSF-3.0
%%BoundingBox: 0 0 595 842

%コメント

newpath
%パス指定
stroke

線の描き方

newpathで先の下記はじめを宣言したあと、movetoで線を書き始める初期位置を設定します。次にlinetoで座標を指定すると、前の座標からその位置までパスを引きます。指定した座標間は、真っ直ぐな線で繋がれます。 最後にstrokeを書いてパスに沿って線を引きます。

x point y point moveto

x point y point lineto

下記の例では、(100, 200)から(300, 400)まで、線を引いています。表示すると、左下から右上に斜めに線が引かれます。

%!PS-Adobe-3.1 EPSF-3.0
%%BoundingBox: 0 0 595 842

newpath
100 200 moveto
300 400 lineto
stroke

f:id:ArtificialArts:20180508214657j:plain

linetoを増やすと、折れ曲がった線を描くことができます。

%!PS-Adobe-3.1 EPSF-3.0
%%BoundingBox: 0 0 595 842

newpath
100 200 moveto
200 100 lineto
300 400 lineto
stroke

f:id:ArtificialArts:20180508214717j:plain

曲線の描き方(ベジェ曲線

曲線を描く場合は、curvetoを使います。数値にすると非常にわかりづらくなりますが、(x1, y1)と(x2, y2)を制御点とした(x3, y3)までの曲線を描画します。

x1 y1 x2 y2 x3 y3 curveto

%!PS-Adobe-3.1 EPSF-3.0
%%BoundingBox: 0 0 595 842

newpath
100 200 moveto
100 50 100 150 200 300 curveto
stroke

f:id:ArtificialArts:20180508224104j:plain

多角形の描き方

多角形を書きたい場合はclosepathを使います。このコードは、現在の位置から書き始めの位置までパスをつなぎ、パスを閉じます。

この例では、(100, 200)と(200, 200)と(200, 300)の位置に頂点を持つ三角形が表示されます。

%!PS-Adobe-3.1 EPSF-3.0
%%BoundingBox: 0 0 595 842

newpath
100 200 moveto
200 200 lineto
200 300 lineto
closepath
stroke

f:id:ArtificialArts:20180508215036j:plain

四角形の場合は、もう1点を追加します。

%!PS-Adobe-3.1 EPSF-3.0
%%BoundingBox: 0 0 595 842

newpath
100 200 moveto
200 200 lineto
200 300 lineto
100 300 lineto
closepath
stroke

f:id:ArtificialArts:20180508215050j:plain

このように、頂点を増やしていけば好きな多角形を描けます。

応用

複数の図形を書く

複数の図形を書きたい場合は、newpathからstrokeまでの指定を増やせば描画するものを増やすことができます。

%!PS-Adobe-3.1 EPSF-3.0
%%BoundingBox: 0 0 595 842

newpath
50 200 moveto
200 100 lineto
300 400 lineto
stroke

newpath
300 500 moveto
400 400 lineto
400 500 lineto
closepath
stroke

newpath
100 200 moveto
200 200 lineto
200 300 lineto
100 300 lineto
closepath
stroke

f:id:ArtificialArts:20180508215127j:plain

線の太さ

線の太さは描画する前にsetlinewidthを使って設定します。 太さはポイントで指定します。

width setlinewidth

%!PS-Adobe-3.1 EPSF-3.0
%%BoundingBox: 0 0 595 842

newpath
100 200 moveto
300 400 lineto
5 setlinewidth
stroke

f:id:ArtificialArts:20180508220541j:plain

線に色を付ける

線に色を付ける場合は、色を指定してから線を引きます。 色はsetrgbcolorを使ってRGBで指定するか、setcymkcolorを使ってCYMKで指定する方法があります。

red green blue setrgbcolor

cyan magenta yellow black setcymkcolor

どちらの場合も、数値は0(最小)から1(最大)の間で設定します。

%!PS-Adobe-3.1 EPSF-3.0
%%BoundingBox: 0 0 595 842

newpath
100 200 moveto
300 400 lineto
5 setlinewidth
0.5 0.7 0.8 setrgbcolor
stroke

f:id:ArtificialArts:20180508220721j:plain

多角形を塗りつぶす

多角形に色を付ける場合、パスを指定したあとにstrokeではなくfillを書きます。 現在設定されている色で塗りつぶされますが、初期状態では黒く塗りつぶされます。

%!PS-Adobe-3.1 EPSF-3.0
%%BoundingBox: 0 0 595 842

newpath
100 200 moveto
200 200 lineto
200 300 lineto
100 300 lineto
closepath
fill

f:id:ArtificialArts:20180508215305j:plain

fillの前に色を指定すればその色で塗りつぶされます

%!PS-Adobe-3.1 EPSF-3.0
%%BoundingBox: 0 0 595 842

newpath
100 200 moveto
200 200 lineto
200 300 lineto
100 300 lineto
closepath
0.3 0.3 0.8 setrgbcolor
fill

f:id:ArtificialArts:20180508221005j:plain

相対値で指定する

図形のパスを指定するとき,movetolinetoを使いますが、この場合は絶対座標での指定となります。頭にrをつけたrmovetorlinetoを使用すると、相対座標での指定(今いる位置からどれだけ移動するか)となります。相対位置のほうがわかりやすい場合もありますが、プログラムが始まった最初の位置やstrokeを行ったあとの位置は不定(どこにあるかわからない状態)となるので、movetoは絶対座標で指定したほうが良さそうです。

%!PS-Adobe-3.1 EPSF-3.0
%%BoundingBox: 0 0 595 842

newpath
100 200 moveto
200 200 rlineto
200 300 rlineto
closepath
fill

f:id:ArtificialArts:20180508221231j:plain

講義では、「showpage」で描画したものを画面に表示すると説明していましたが、参考にしたページでは下記の記述がありました。記述しても問題はないと書かれていて、実際に問題なく動くのでどちらでもいいのかもしれません。

Finally, the EPS file should not use showpage. Actually, Adobe says that it is fine to use showpage in your EPS files. Officially, it is the responsibility of the importing application to redefine showpage so that the EPS file does not actually eject the page. Still, in creating EPS files, it would be wise not to use this operator.
最後に、EPSファイルはshowpageを使用すべきではありません。 実際には、EPSファイルにshowpageを使用することは問題ありません。 公式には、EPSファイルが実際にページを排出しないように、showpageを再定義するのは、インポートするアプリケーションの責任です。 それでも、EPSファイルを作成する場合は、この演算子を使用しないことをお勧めします。

このほかにもいろいろと描き方があるようですが、調べたりまとめたりしていると終わりがないので、PostScriptはこれくらいで終わりにしておきます。ほかにも知りたいものがある場合は、参考ページの「Index of Examples」や「Index of Operators」を見ると多くの情報が載っています。

参考ページ: A First Guide to PostScript