В репозитории опубликовано два примера: Mandelbrot и Mandelbrot2. Ниже представлен исходный код первого из них. Программа рисует множество Мандельброта с полутонами.

Назначение процедуры Go — нарисовать одну точку (одного из 256 оттенков красного). Точка (sx, sy) задаёт место на экране (в пикселях), а точка (x, y) соответсвует точке (sx, sy), но уже на расчётной плоскости (не в пикселях). Координата y меняется на промежутке [-1; 1]. Координата x меняется так, чтобы центр координат был правее середины экрана (2 к 1). Цвет задаётся функциональной процедурой G.MakeCol в конце процедуры Go.

Для того, чтобы расчитать цвет, используется цикл REPEAT. В этом цикле происходит следующий расчёт:
z0 = 0
zn+1 = zn2 + c
Где c — комплексное число (x, y).
В цикле число z представлено как (re, im), где re — действительная часть числа z, а im — величина мнимой части числа z.

Код
MODULE Mandelbrot;
IMPORT G := Graph;
VAR s: G.Bitmap;

PROCEDURE Go(sx, sy: INTEGER; x, y: REAL);
CONST iter = 768;
VAR col, i: INTEGER;
  re, im, re2: REAL;
BEGIN re := x; im := y; i := 0;
  REPEAT re2 := re * re - im * im;
    im := 2 * re * im; re := re2;
    re := re + x; im := im + y; INC(i)
  UNTIL (i = iter) OR (re * re + im * im > 4);
  IF i # iter THEN i := i * 5;
    IF i > 255 THEN i := 255 END;
    G.PutPixel(s, sx, sy, G.MakeCol(i, 0, 0))
  END
END Go;

PROCEDURE Do;
VAR x, y: INTEGER;
  x0, y0, x1, y1: REAL;
BEGIN G.Settings(0, 0, {G.fullscreen});
  s := G.Init(); G.Flip;
  y0 := 1; y1 := -1;
  x1 := 2 * s.w / s.h / 3; x0 := -x1 * 2;
  FOR y := 0 TO s.h - 1 DO
    FOR x := 0 TO s.w - 1 DO
      Go(x, y, x0 + x / (s.w - 1) * (x1 - x0),
               y0 + y / (s.h - 1) * (y1 - y0))
    END
  END;
  G.Flip; G.Pause; G.Close
END Do;

BEGIN
  Do
END Mandelbrot.


Нажмите для просмотра прикрепленного файла

Второй пример показывает это же множество, но в другом масштабе и анимировано.

Нажмите для просмотра прикрепленного файла