home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ZSYS / ZNODE-12 / I / MXPLOT.LBR / DRAGON.PZS / DRAGON.PAS
Pascal/Delphi Source File  |  1991-10-03  |  5KB  |  154 lines

  1.  
  2. program dragon;
  3.  
  4. { Author: Larry Schnitger, co-Sysop, Zitel BBS, 617 965-7046 }
  5.  
  6. const
  7.   maxdot = 575;                        { highest x or y value FXPLOT allows }
  8.                                        { when using the 72 dpi mode }
  9. var
  10.   folds : array[1..8191] of char;      { space for order 13: 2^13-1=8191 }
  11.   dx, dy : array[0..3] of integer;
  12.   xmax, xmin, xend, ymax, ymin, yend : integer;
  13.   order, numf : integer;
  14.   d0, x0, y0 : integer;
  15.   range, side, str, corner : integer;
  16.   pfile : text;                        { plot file read by FXPLOT }
  17.  
  18. {--------------------------------------------------------------------------}
  19.  
  20. procedure calcfolds( n : integer; var last : integer );
  21. var
  22.   f, i : integer;
  23. begin
  24.   last:=0;                             { initialize last calculated fold }
  25.   for f:=1 to n do                     { iteratively calculate fold sequence }
  26.     begin
  27.       folds[last+1]:='L';    { insert next fold (all are L for dragon) }
  28.  
  29.     { if not odd(f) then folds[last+1]:='R'; }  
  30.  
  31.                                        { un-comment the statement above }
  32.                                        { to alternate folds }
  33.                                        { (LRLR...) a very surprising }
  34.                                        { result!! }
  35.  
  36.       for i:=1 to last do              { next piece is same as first... }
  37.         folds[last+1+i]:=folds[i];
  38.  
  39.       if (last>0) and                  { ...except reverse middle fold }
  40.          (folds[last+1 + (last+1) div 2]='L')
  41.         then folds[last+1 + (last+1) div 2]:='R'
  42.         else folds[last+1 + (last+1) div 2]:='L';
  43.  
  44.       last:=2*last+1                   { update last fold value }
  45.     end
  46. end; {calcfolds}
  47.  
  48. {--------------------------------------------------------------------------}
  49.  
  50. procedure limits( d, numfold : integer);
  51. var
  52.   i : integer;
  53. begin
  54.   xmin:=0; xmax:=0; ymin:=0; ymax:=0;  { get set to find size of result }
  55.   xend:=dx[d]; yend:=dy[d];
  56.  
  57.   if xend<0 then xmin:=xend else xmax:=xend;
  58.   if yend<0 then ymin:=yend else ymax:=yend;
  59.  
  60.   for i:=1 to numfold do               { for each fold in the strip }
  61.     begin
  62.       if folds[i]='L'
  63.         then d:=(d+1) mod 4            { turn clockwise or }
  64.         else d:=(d+3) mod 4;           { turn counter-clockwise }
  65.  
  66.       xend:=xend+dx[d]; yend:=yend+dy[d];  { add length in proper direction }
  67.  
  68.       if xend>xmax then xmax:=xend;    { update max/min values }
  69.       if xend<xmin then xmin:=xend;
  70.       if yend>ymax then ymax:=yend;
  71.       if yend<ymin then ymin:=yend
  72.     end;
  73.  
  74.   write( 'order ', order:2, ':  ' );
  75.   write( 'endpoint = (', xend, ', ', yend, '),   ' );
  76.   write( 'x ranges ', xmin, ' to ', xmax, ',  ');
  77.   writeln( 'y ranges ', ymin, ' to ', ymax, '.' )
  78. end; {limits}
  79.  
  80. {--------------------------------------------------------------------------}
  81.  
  82. procedure plotfile( x, y, d, st, cr, n : integer);
  83. var
  84.   i, j, dold : integer;
  85. begin
  86.   write( 'plotting:  ', 'x0 = ', x:3, '  y0 = ', y:3, '  d0 = ', d );
  87.   writeln( '   side = ', st+2*cr:3, '  strt = ', st:2, '  crnr = ', cr:2 );
  88.  
  89.   { draw initial segment.  V draws a vector, needs (x1,y1) & (x2,y2) }
  90.  
  91.   x:=x+cr*dx[d]; y:=y+cr*dy[d];        { (x1,y1) }
  92.   write(pfile, 'V', chr(hi(x)), chr(lo(x)), chr(hi(y)), chr(lo(y)) );
  93.  
  94.   x:=x+st*dx[d]; y:=y+st*dy[d];        { (x2,y2) }
  95.   write(pfile, chr(hi(x)), chr(lo(x)), chr(hi(y)), chr(lo(y)) );
  96.  
  97.   for i:=1 to n do                     { for each fold... }
  98.     begin
  99.       dold:=d;                         { previous direction }
  100.  
  101.       if folds[i]='L'                  { calc. new direction }
  102.         then d:=(d+1) mod 4            { turn c-wise or }
  103.         else d:=(d+3) mod 4;           { turn c-c-wise }
  104.  
  105.       { draw a corner by plotting individual points.  P plots point (x,y) }
  106.       { (done this way because fxplot does crummy angles) }
  107.  
  108.       for j:=1 to cr do
  109.         begin
  110.           x:=x+dx[dold]+dx[d]; y:=y+dy[dold]+dy[d];  { does a 45 deg corner }
  111.           write(pfile, 'P', chr(hi(x)), chr(lo(x)), chr(hi(y)), chr(lo(y)) )
  112.         end;
  113.  
  114.       { draw next segment. R draws line from previous position to (x,y) }
  115.  
  116.       x:=x+dx[d]*st; y:=y+dy[d]*st;
  117.       write(pfile, 'R', chr(hi(x)), chr(lo(x)), chr(hi(y)), chr(lo(y)) )
  118.     end
  119. end; {plotfile}
  120.  
  121. {---------------------------------------------------------------------------}
  122.  
  123. begin {dragon}
  124.  
  125. repeat
  126.   writeln;
  127.   write('What order dragon to plot?  (1 to 13)  ');
  128.   readln(order);
  129. until (order<=13) and (order>0);
  130. writeln;
  131.  
  132. d0:=0;                                 { default starting direction }
  133. repeat
  134.   write('what direction to start?  (0 to 3):  ');
  135.   readln(d0);
  136. until (d0>=0) and (d0<=3);
  137.  
  138. dx[0]:= 1; dy[0]:= 0;   {   0 }        { offsets for various directions }
  139. dx[1]:= 0; dy[1]:= 1;   {  90 }
  140. dx[2]:=-1; dy[2]:= 0;   { 180 }
  141. dx[3]:= 0; dy[3]:=-1;   { 270 }
  142.  
  143. calcfolds(order, numf);                { figure sequence of folds }
  144.  
  145. limits(d0, numf);                      { figure min's, max's, end point }
  146.  
  147. {$I DRAGN-1.INC }
  148.  
  149. { ** change include file to ** }
  150. { ** D4-HEADS.INC or D4-TAILS.INC for 4 dragon plot ** }
  151.  
  152. end. {dragon}
  153.  
  154.