mandelbrot-plotutils.a68

     
   1  COMMENT
   2  
   3  @section Synopsis
   4  
   5  Plot a part of the Mandelbrot set.
   6  
   7  Plot (part of) the Mandelbrot set, that are points z[0] in the complex plane
   8  for which the sequence z[n+1] := z[n] ** 2 + z[0] (n >= 0) is bounded.
   9  
  10  This program requires a68g to be built with the GNU plotutils library.
  11  
  12  COMMENT
  13  
  14  PRAGMAT need plotutils PRAGMAT
  15  
  16  INT pix = 300, max iter = 256, REAL zoom = 0.33 / pix;
  17  [-pix : pix, -pix : pix] INT plane;
  18  COMPL ctr = 0.05 I 0.75 # center of set #;
  19  
  20  # Compute the length of an orbit. #
  21  
  22  PROC iterate = (COMPL z0) INT:
  23    BEGIN COMPL z := z0, INT iter := 1;
  24          WHILE (iter +:= 1) < max iter # not converged # AND ABS z < 2 # not diverged #
  25          DO z := z * z + z0
  26          OD;
  27          iter
  28    END;
  29  
  30  # Compute set and find maximum orbit length. #     
  31  
  32  INT max col := 0;
  33  FOR x FROM -pix TO pix
  34  DO FOR y FROM -pix TO pix
  35     DO COMPL z0 = ctr + (x * zoom) I (y * zoom);
  36        IF (plane [x, y] := iterate (z0)) < max iter
  37        THEN (plane [x, y] > max col | max col := plane [x, y])
  38        FI
  39     OD
  40  OD;
  41  
  42  # Make a plot. #
  43  
  44  FILE plot;
  45  INT num pix = 2 * pix + 1;
  46  open (plot, "mandelbrot.png", stand draw channel);
  47  make device (plot, "png", whole (num pix, 0) + "x" + whole (num pix, 0));
  48  FOR x FROM -pix TO pix
  49  DO FOR y FROM -pix TO pix
  50     DO INT col = (plane [x, y] > max col | max col | plane [x, y]);
  51        REAL c = sqrt (1- col / max col); # sqrt to enhance contrast #
  52        draw colour (plot, c, c, c);
  53        draw point (plot, (x + pix) / (num pix - 1), (y + pix) / (num pix  - 1))
  54     OD
  55  OD;
  56  close (plot)