[comp.graphics] Mandelbrot and fracta generators fo

mccaugh@s.cs.uiuc.edu (08/17/89)

 By PD I take it you mean: Public Domain, but SW (ShareWare?) -- anyway, if by
 "generator" you mean a "generalized fractalizer" that takes as its input one
 user's procedure for fractalizing a line (classic example: von Koch), then I
 may have just what you're looking for: it is in Turbo Pascal:V-4, and accepts
 CGA or EGA. As you are on the MacII, I would need to know how to compatible-
 ize it for your machine.
 I originally wrote my system to ferret out the limits of turtle geometry as
 applied to fractals, so all the user's procedure has to do is:

       *  take as input a RECORD-type baseline (x1,y1 and x2,y2)
       *  use TURN(+/- theta) and MoveToPt(distance) as primitives
          to generate an array-of-record successors to the given
          base-line

 For example (von Koch): given original line (x1,y1),(x2,y2):
      *  provide length(original base-line) as a given; (so: point[1].x := Xo;)
      *  set new distance d' = distance/3              (and: point[1].y := Yo;)
      *  submit 4 new line-segments to replace the old:
         > MoveToPt(d')  (assuming heading is same as for current line)
                         then record globals Xo,Yo as the point moved to
                         via: point[2].x := Xo;  point[2].y := Yo;
                         then use: point[1] and point[2] to define line[1];
         > Turn(+Pi/3)
         > MoveToPt(d')  and record Xo,Yo as the next point moved to, say,
                         as: point[3].x := Xo;  point[3].y := Yo;
                         then use: point[2] and point[3] to define line[2];
         > Turn(-2*Pi/3)
         > MoveToPt(d')  likewise;
         > Turn(+Pi/3)
         > MoveToPt(d')  likewise.

  So now, the generated line-segments have been recorded, and we are done.
  To be more specific, the user-defined proc. would include as parameters:
  *  n = number of line-segments to replace the base-line (up to 20)
  *  VAR-type array-of-linetype in which to place generated line-segments
  
  Again, the turtle-geometry primitives are meant to be a convenience for
  the users supplying their own generators (as well as to test efficacy).
  As usual, globals include: current-point and angle of inclination: only
  the "distance-to-move" is a local (following standard practice). The
  original length(base-line) should be supplied as a CONST, and the whole
  user-supplied code should be submitted as a ".INC" in a graphics pro-
  gram that also $INCLUDEs my procedure (which of course in turn takes the
  user's procedure as parameter P). The end result of all this should be:

  Given: an arbitrarily-long array A of line-type records
  ~~~~~

   Find: for each line-segment entry, its n<21 successors and replace
   ~~~~

  Clearly, then, the user doing the generating must manage this array
  (which in the case of von Koch, consists of 1 entry, then 4, then 16, etc.)
  so that there is always space in it to accomodate a newly-generated 
  line-segment sequence. Once his/her array gets filled up, it is finally
  time to display the fractal via LINE-calls from the array. All my proc.
  does is to use relative geoemtry to facilitate generation of the line-
  segments constituting the replacements.