[comp.lang.postscript] dragon.ps -- another cute sample program

ccaw001@UTADNX.CC.UTEXAS.EDU ("Rick Watson") (02/12/88)

%!
%%      generate binary dragon.
%
%       A space-filling curve.  If you were to round the corners, the line
%       would never intersect itself.
%
%       The algorithm:  Initialize a counter to 1.  Find the least 
%       significant "1" bit in the counter.  The next more significant
%       bit in the counter determines move left or move right. Increment
%       the counter. Repeat until the counter reaches 2**n, where n is 
%       the "order" of the dragon.
%
%       My first postscript program from a few years ago.
%
%       Rick Watson
%       University of Texas Computation Center
%        arpa:   ccaw001@utadnx.cc.utexas.edu
%        uucp:   ...seismo!ut-sally!ut-emx!rick
%        bitnet: ccaw001@utadnx
%        span:   utspan::ccaw001
%        phone:  512/471-8220 471-3241
%
/dragon
{
        currentpoint /y exch def /x exch def
        /movex 0 def
        /movey step def
        1 1 1 order bitshift {
                {
                        dup 1 and 0 ne {exit} if
                        -1 bitshift
                } loop
                2 and 0 ne {
                        movex 0 ne {
                                /movey movex def
                                /movex 0 def
                        }
                        {
                                /movex movey neg def
                                /movey 0 def
                        } ifelse
                }
                {
                        movex 0 ne {
                                /movey movex neg def
                                /movex 0 def
                        }
                        {
                                /movex movey def
                                /movey 0 def
                        } ifelse
                } ifelse
                /x x movex add def /y y movey add def
                x y lineto
                currentpoint
                stroke
                moveto
        } for
} def

/step 4 def             % set step size
/order 14 def           % set order
72. 300. div dup scale
5 300 mul dup moveto
0 setlinewidth
dragon

/step 16 def
/order 6 def
5 300 mul 7 300 mul moveto
dragon

showpage