PostScriptを手書きするという荒行の記録(?)。気合や根性や才能じゃない(はずだ)、こういうのはトレーニング(のはず)だ。 ちょうど
SICPにリトライ中なので
図形言語のところではSchemeでPostScriptのコードを吐きたいな。
↑ぐるぐるブン回すくらいまではできるようになった。
ただ写経するだけではおもしろくないなーと思ったのでほんの少しずつ手を加えてみた。参考資料は当記事最下に記載。
改行の位置とかそういうPostScriptコーディングの文化がとういったものかまだよくわからない。
stackの状態が良くわからなくなったらGhostScriptで確認してる。stackコマンドでスタックの状態が見れる。
四角
newpath
270 360 moveto
0 72 rlineto
72 0 rlineto
0 -72 rlineto
-72 0 rlineto
4 setlinewidth
stroke
370 360 moveto
0 172 rlineto
172 0 rlineto
0 -172 rlineto
-172 0 rlineto
32 setlinewidth
stroke
270 560 moveto
0 72 rlineto
72 0 rlineto
0 -72 rlineto
-72 0 rlineto
4 setlinewidth
closepath
stroke
370 600 moveto
0 72 rlineto
72 0 rlineto
0 -72 rlineto
-72 0 rlineto
32 setlinewidth
closepath
stroke
showpage
座標を確認
% test moveto
newpath
/Times-Roman findfont 15 scalefont setfont
100 0 moveto
((100,0)) show
0 100 moveto
((0,100)) show
100 100 moveto
((100,100)) show
座標がどうなってるのかわからなかったのでお試し。
x軸 y軸 moveto
というようなことでよさそうですね。
色の違う四角形を描画
% step by step Draw Box
newpath
100 100 moveto
0 72 rlineto
closepath
fill
newpath
100 200 moveto
0 72 rlineto
72 0 rlineto
closepath
fill
newpath
100 300 moveto
0 72 rlineto
72 0 rlineto
0 -72 rlineto
closepath
fill
newpath
100 400 moveto
0 72 rlineto
72 0 rlineto
0 -72 rlineto
closepath
.5 setgray
fill
newpath
100 500 moveto
0 72 rlineto
72 0 rlineto
0 -72 rlineto
closepath
.9 setgray
fill
四角形を描画するプロシージャを定義してみる
% draw Boxies with procedure
/box
{
72 0 rlineto
0 72 rlineto
-72 0 rlineto
closepath
} def
newpath
352 324 moveto box
0 setgray fill
newpath
370 360 moveto box
.4 setgray fill
newpath
388 396 moveto box
.8 setgray fill
なんか三角形が書けそうだったので
/delta
{
0 72 rlineto
72 0 rlineto
closepath
} def
newpath
352 424 moveto delta
0 setgray fill
newpath
370 460 moveto delta
.4 setgray fill
newpath
388 496 moveto delta
.8 setgray fill
388 496 moveto
0 setgray
/Times-Roman findfont 15 scalefont setfont
(delta) show
/delta2
{
72 0 rlineto
0 72 rlineto
closepath
} def
newpath
252 424 moveto delta2
0 setgray fill
newpath
270 460 moveto delta2
.4 setgray fill
newpath
288 496 moveto delta2
.8 setgray fill
288 496 moveto
0 setgray
/Times-Roman findfont 15 scalefont setfont
(delta 2) show
showpage
もひとつプロシージャ
newpath
100 100 newpath moveto
0 300 rlineto
stroke
newpath
/inch
{
72 mul
} def
/box
{
newpath
moveto
1 inch 0 rlineto
0 1 inch rlineto
-1 inch 0 rlineto
closepath
} def
/fillbox
{
setgray fill
} def
3.5 inch 4.5 inch box
0 fillbox
3.75 inch 5 inch box
.4 fillbox
4 inch 5.5 inch box
.8 fillbox
showpage
文字列の描画
% vertical position
/vpos 720 def
% drawing string
/word (Typefaces) def
/choosefont
{
findfont 15 scalefont setfont
} def
/newline
{
% decrease vpos
% side effect
/vpos vpos 15 sub def
% goto that line
72 vpos moveto
} def
/printword
{
choosefont
% show "typefaces"
word show
% go to next line
newline
} def
72 vpos moveto
/Times-Roman printword
/Times-Bold printword
/Times-Italic printword
/Times-BoldItalic printword
newline
/Helvetica printword
/Helvetica-Bold printword
/Helvetica-Oblique printword
/Helvetica-BoldOblique printword
newline
/Courier printword
/Courier-Bold printword
/Courier-Oblique printword
/Courier-BoldOblique printword
newline
/Symbol printword
showpage
/Times-Roman findfont 15 scalefont setfont
72 200 moveto
(typography) show
/showGorilla
{
moveto
(Gorilla) show
} def
/Times-Roman findfont 6 scalefont setfont
72 300 showGorilla
/Times-Roman findfont 10 scalefont setfont
72 275 showGorilla
/Times-Roman findfont 15 scalefont setfont
72 250 showGorilla
/Times-Roman findfont 20 scalefont setfont
72 225 showGorilla
/scaleTimes
{
/Times-Roman findfont
exch scalefont
setfont
} def
6 scaleTimes
172 300 showGorilla
10 scaleTimes
172 275 showGorilla
15 scaleTimes
172 250 showGorilla
25 scaleTimes
172 225 showGorilla
/draw
{
172 exch showGorilla
} def
6 scaleTimes
400 draw
10 scaleTimes
375 draw
15 scaleTimes
350 draw
25 scaleTimes
325 draw
showpage
文字列と図形
/choosefont
{
exch findfont exch scalefont
} def
/MainFont
{
/Helvetica-Bold 15 choosefont
} def
/SloganFont
{
/Helvetica-Oblique 7 choosefont
} def
/OwnerFont
{
/Helvetica 10 choosefont
} def
/rightshow
{
dup stringwidth pop
120 exch sub
0 rmoveto
show
} def
/CardOutline
{
newpath
90 90 moveto
0 144 rlineto
252 0 rlineto
0 -144 rlineto
closepath
.5 setlinewidth
stroke
} def
/doBorder
{
99 99 moveto
0 126 rlineto
234 0 rlineto
0 -126 rlineto
closepath
2 setlinewidth
stroke
} def
/Diamond
{
newpath
207 216 moveto
36 -54 rlineto
-36 -54 rlineto
-36 54 rlineto
closepath
.8 setgray fill
} def
/doText
{
0 setgray
90 180 moveto
MainFont setfont
(Diamond Cafe) rightshow
90 168 moveto
SloganFont setfont
("The Club of Lonely Hearts") rightshow
216 126 moveto
OwnerFont setfont
(Sam Spade) show
216 111 moveto
(Owner) show
} def
CardOutline
doBorder
Diamond
doText
newpath
10 10 moveto
(string1) show
(string2) rightshow
(string3) rightshow
(string4) rightshow
showpage
回転
/choosefont
{
exch findfont exch scalefont setfont
} def
/Times-Roman 30 choosefont
/square
{
newpath
0 0 moveto
90 0 lineto
90 90 lineto
0 90 lineto
closepath
fill
6 92 moveto
(A Box) show
} def
/slide
{
300 150 translate
60 rotate
} def
square
slide
.5 setgray
1.5 1.5 scale
square
slide
.7 setgray
.75 1.25 scale
square
showpage
☆
/starside{
72 0 lineto
currentpoint translate
-144 rotate
} def
/star{
moveto
currentpoint translate
%4 {starside} repeat
%closepath
5 {starside} repeat
gsave
.5 setgray
fill
grestore
stroke
} def
200 200 star
/cycling{
15 {
30 30 star
30 rotate
} repeat
} def
/drawing{
5 {
30 -30 translate
cycling
} repeat
} def
drawing
showpage
とりあえず今日はここまで。英語読むのもしんどいし。読み進めてるのはこちらの青本。