summaryrefslogtreecommitdiff
path: root/dviware/dvi-augsburg/manual/texfish.ps
diff options
context:
space:
mode:
Diffstat (limited to 'dviware/dvi-augsburg/manual/texfish.ps')
-rw-r--r--dviware/dvi-augsburg/manual/texfish.ps246
1 files changed, 246 insertions, 0 deletions
diff --git a/dviware/dvi-augsburg/manual/texfish.ps b/dviware/dvi-augsburg/manual/texfish.ps
new file mode 100644
index 0000000000..bd2da3953c
--- /dev/null
+++ b/dviware/dvi-augsburg/manual/texfish.ps
@@ -0,0 +1,246 @@
+%!
+%%BoundingBox: -0.125903 -0.125882 252.126 252.126
+% The following are all the functions required to produce the famous
+% "Square Limit" drawing by M. C. Escher. These functions were derived by
+% Peter Henderson. See his paper in 1982 Conf. on LISP and Func. Prog.
+% (C) Miranda coding by Michael Parsons, September 1985
+% Translation to PostScript by Peter Bumbulis, July 1986
+%
+
+% quartet combines 4 images, one image in each quadrant, to produce one image.
+/quartet {
+ 4 -1 roll 1 2 div 0 1 zoom
+ 4 -1 roll 1 2 div 1 1 zoom
+ 4 -1 roll 1 2 div 0 0 zoom
+ 4 -1 roll 1 2 div 1 0 zoom
+ 4 {exec} /repeat cvx
+ 7 array astore cvx
+} def
+
+% nonet arranges 9 images in equal sized squares to form 1 image.
+/nonet {
+ 9 -1 roll 1 3 div 0 1 zoom
+ 9 -1 roll 1 3 div 0.5 1 zoom
+ 9 -1 roll 1 3 div 1 1 zoom
+ 9 -1 roll 1 3 div 0 0.5 zoom
+ 9 -1 roll 1 3 div 0.5 0.5 zoom
+ 9 -1 roll 1 3 div 1 0.5 zoom
+ 9 -1 roll 1 3 div 0 0 zoom
+ 9 -1 roll 1 3 div 0.5 0 zoom
+ 9 -1 roll 1 3 div 1 0 zoom
+ 9 {exec} /repeat cvx
+ 12 array astore cvx
+} def
+
+% cycle combines 4 smaller copies of an image, each rotated by a different
+% multiple of 90 degrees.
+/cycle {dup 270 rot dup 180 rot dup 90 rot quartet} def
+
+% t is one of the basic fish rearrangements.
+/t {{p} {q} {r} {s} quartet} def
+
+% u is another of the basic fish rearrangements.
+/u {{q} 90 rot cycle} def
+
+% side defines one side of the picture at level n.
+/side {
+ dup 0 le
+ { pop {} dup t 90 rot t quartet}
+ {1 sub side dup t 90 rot t quartet}
+ ifelse
+} def
+
+% corner defines one corner of the picture at level n.
+/corner {
+ dup 0 le
+ { pop {} {} {} u quartet}
+ {1 sub dup corner exch side dup 90 rot u quartet}
+ ifelse
+} def
+
+% quadcorner forms one quarter of the image at level n;
+/quadcorner {
+ dup corner exch side dup dup 90 rot dup u exch t 90 rot dup 3 1 roll
+ {q} 90 rot nonet
+} def
+
+% squarelimit produces the fish drawing.
+/squarelimit {quadcorner cycle} def
+
+% fish gives a border to produce the final drawing.
+/fish {
+ squarelimit exec
+ newpath
+ 0 0 moveto
+ 0 1 lineto
+ 1 1 lineto
+ 1 0 lineto
+ closepath
+ stroke
+} def
+
+/flip {0.5 0.5 translate 1 -1 scale -0.5 -0.5 translate} def
+
+% All the data needed to draw the fish.
+/p {
+ gsave flip
+ newpath
+ 0 0.8125 moveto 0 0.5 lineto
+ 0 0.8125 moveto 0.1875 0.75 lineto
+ 0.75 0 moveto 0.8125 6.25e-2 lineto
+ 0.1875 0.75 moveto 0 0.5 lineto
+ 0.375 1 moveto 0.25 0.75 lineto
+ 0.25 0.6875 moveto 0.4375 0.625 lineto
+ 0.25 0.6875 moveto 0.25 0.375 lineto
+ 0.4375 0.625 moveto 0.25 0.375 lineto
+ 0.6875 1 moveto 0.625 0.75 lineto
+ 0.6875 1 moveto 0.875 0.875 lineto
+ 0.875 0.875 moveto 1 0.875 lineto
+ 0.625 0.75 moveto 0.8125 0.6875 lineto
+ 0.8125 0.6875 moveto 1 0.75 lineto
+ 0.625 0.75 moveto 0.5 0.5 lineto
+ 0.5625 0.625 moveto 0.75 0.5625 lineto
+ 0.75 0.5625 moveto 1 0.625 lineto
+ 0.5 0.5 moveto 0.75 0.4375 lineto
+ 0.75 0.4375 moveto 1 0.5 lineto
+ 0.5 0.5 moveto 0.25 0.1875 lineto
+ 0.25 0.1875 moveto 0 0 lineto
+ 0.5 0.25 moveto 1 0.375 lineto
+ 1 0.25 moveto 0.75 0.25 lineto
+ 0.75 0.25 moveto 0.5 0 lineto
+ 0.5 0 moveto 0.375 6.25e-2 lineto
+ 0.375 6.25e-2 moveto 0 0 lineto
+ 0.625 0 moveto 0.75 0.125 lineto
+ 0.75 0.125 moveto 1 0.1875 lineto
+ 1 0.125 moveto 0.8125 6.25e-2 lineto
+ 1 6.25e-2 moveto 0.875 0 lineto
+ stroke
+ grestore
+} def
+
+/q {
+ gsave flip
+ newpath
+ 0 0 moveto 0 0.25 lineto
+ 0 0.5 moveto 0 1 lineto
+ 0 1 moveto 0.5 1 lineto
+ 0.75 1 moveto 1 1 lineto
+ 0.125 1 moveto 0.25 0.6875 lineto
+ 0.25 1 moveto 0.375 0.6875 lineto
+ 0.375 1 moveto 0.5 0.6875 lineto
+ 0.5 1 moveto 0.625 0.625 lineto
+ 0.25 0.6875 moveto 0.25 0.5625 lineto
+ 0.375 0.6875 moveto 0.375 0.5625 lineto
+ 0.5 0.6875 moveto 0.5 0.5 lineto
+ 0.625 0.625 moveto 0.625 0.4375 lineto
+ 0.625 1 moveto 0.875 0.3125 lineto
+ 0.75 1 moveto 0.8125 0.75 lineto
+ 0.8125 1 moveto 1 0.625 lineto
+ 0.875 1 moveto 1 0.75 lineto
+ 0.9375 1 moveto 1 0.875 lineto
+ 0 0.25 moveto 0.1875 0.1875 lineto
+ 0 0.375 moveto 0.4375 0.3125 lineto
+ 0 0.5 moveto 0.25 0.5625 lineto
+ 0.125 0 moveto 0.1875 0.1875 lineto
+ 0.1875 0.1875 moveto 0.3125 0.125 lineto
+ 0.3125 0.125 moveto 0.25 0 lineto
+ 0.3125 0.125 moveto 0.4375 6.25e-2 lineto
+ 0.4375 6.25e-2 moveto 0.5 0 lineto
+ 0.5 6.25e-2 moveto 0.6875 6.25e-2 lineto
+ 0.6875 6.25e-2 moveto 0.5625 0.1875 lineto
+ 0.5625 0.1875 moveto 0.5 6.25e-2 lineto
+ 0.5625 0.25 moveto 0.75 0.25 lineto
+ 0.75 0.25 moveto 0.625 0.375 lineto
+ 0.625 0.375 moveto 0.5625 0.25 lineto
+ 1 0 moveto 0.75 0.375 lineto
+ 0.375 0 moveto 0.4375 6.25e-2 lineto
+ 0.75 0.375 moveto 0.375 0.5625 lineto
+ 0.375 0.5625 moveto 0.25 0.5625 lineto
+ 1 0 moveto 0.9375 0.375 lineto
+ 0.9375 0.375 moveto 1 0.5 lineto
+ 1 0.5 moveto 0.8125 0.75 lineto
+ stroke
+ grestore
+} def
+
+/r {
+ gsave flip
+ newpath
+ 0.5 0.5 moveto 0.125 0.25 lineto
+ 0.125 0.25 moveto 0 0 lineto
+ 0 0.5 moveto 0.125 0.25 lineto
+ 0 0.25 moveto 6.25e-2 0.125 lineto
+ 0 1 moveto 0.5 0.5 lineto
+ 0 0.75 moveto 0.3125 0.375 lineto
+ 6.25e-2 0.9375 moveto 0.25 1 lineto
+ 0.125 0.875 moveto 0.5 1 lineto
+ 0.1875 0.8125 moveto 0.5 0.875 lineto
+ 0.3125 0.6875 moveto 0.75 0.8125 lineto
+ 0.5 0.875 moveto 0.75 1 lineto
+ 0.75 0.8125 moveto 1 1 lineto
+ 0.5 0.5 moveto 0.875 0.625 lineto
+ 1 0.625 moveto 0.6875 0.375 lineto
+ 0.6875 0.375 moveto 0.375 0 lineto
+ 1 0.5 moveto 0.75 0.25 lineto
+ 1 0.75 moveto 0.875 0.625 lineto
+ 0.75 0.25 moveto 0.6875 0 lineto
+ 0.75 0.25 moveto 1 0 lineto
+ 1 0.375 moveto 0.8125 0.1875 lineto
+ 1 0.25 moveto 0.875 0.125 lineto
+ 1 0.125 moveto 0.9375 6.25e-2 lineto
+ stroke
+ grestore
+} def
+
+/s {
+ gsave flip
+ newpath
+ 0 1 moveto 0.25 0.875 lineto
+ 0.125 0.9375 moveto 0 0.75 lineto
+ 0.25 0.875 moveto 0.5 0.875 lineto
+ 0.5 0.875 moveto 1 1 lineto
+ 1 1 moveto 0.625 0.75 lineto
+ 0.625 0.75 moveto 0.5 0.625 lineto
+ 0 0.625 moveto 0.4375 0.75 lineto
+ 0 0.5 moveto 0.5 0.625 lineto
+ 0 0.375 moveto 0.4375 0.5 lineto
+ 0 0.25 moveto 0.4375 0.375 lineto
+ 0 0.125 moveto 0.4375 0.1875 lineto
+ 0.5 0.625 moveto 0.4375 0.5 lineto
+ 0.4375 0.5 moveto 0.4375 0.1875 lineto
+ 0.4375 0.1875 moveto 0.5 0 lineto
+ 0.625 0 moveto 0.6875 0.375 lineto
+ 0.75 0 moveto 0.8125 0.1875 lineto
+ 0.8125 0.1875 moveto 0.9375 0.4375 lineto
+ 0.9375 0.4375 moveto 1 0.5 lineto
+ 1 0.125 moveto 0.8125 0.1875 lineto
+ 1 0.25 moveto 0.875 0.3125 lineto
+ 1 0.375 moveto 0.9375 0.4375 lineto
+ 0.75 0.5625 moveto 0.75 0.75 lineto
+ 0.75 0.75 moveto 0.625 0.625 lineto
+ 0.625 0.625 moveto 0.75 0.5625 lineto
+ 0.8125 0.5625 moveto 0.9375 0.5 lineto
+ 0.9375 0.5 moveto 0.9375 0.6875 lineto
+ 0.9375 0.6875 moveto 0.8125 0.5625 lineto
+ stroke
+ grestore
+} def
+
+% rot rotates an image by th radians anti-clockwise, about the image centre.
+/rotcode {gsave 0.5 0.5 translate rotate -0.5 -0.5 translate exec grestore} def
+
+/rot { /rotcode cvx 3 array astore cvx } def
+
+% zoom scales an image up or down with one fixed point.
+/zoomcode {
+ gsave 2 copy neg exch neg exch 5 2 roll translate dup scale translate exec grestore
+} def
+/zoom { /zoomcode cvx 5 array astore cvx} def
+
+/setup {36 7 mul dup scale .001 setlinewidth} def
+
+% display a level 1 fish
+
+setup
+1 fish
+