Browse Source

Added 2 Mandelbrot set examples

Artur Efimov 7 years ago
parent
commit
4b5eefeaab
2 changed files with 113 additions and 0 deletions
  1. 42 0
      Programs/Mandelbrot.Mod
  2. 71 0
      Programs/Mandelbrot2.Mod

+ 42 - 0
Programs/Mandelbrot.Mod

@@ -0,0 +1,42 @@
+MODULE Mandelbrot;
+IMPORT G := Graph;
+VAR s: G.Bitmap;
+  black: INTEGER;
+
+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 G.PutPixel(s, sx, sy, black)
+  ELSE 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();
+  black := G.MakeCol(0, 0, 0);
+  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.

+ 71 - 0
Programs/Mandelbrot2.Mod

@@ -0,0 +1,71 @@
+MODULE Mandelbrot2;
+IMPORT G := Graph, M := Math;
+CONST iter = 768;
+VAR s: G.Bitmap;
+  col: INTEGER;
+  m: POINTER TO ARRAY OF ARRAY OF INTEGER;
+  angle: REAL;
+
+PROCEDURE Go(sx, sy: INTEGER; x, y: REAL);
+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);
+  m[sy, sx] := i
+END Go;
+
+PROCEDURE Draw;
+VAR i, x, y: INTEGER;
+  shine: REAL;
+BEGIN shine := (1 - M.cos(angle)) * 1;
+  FOR y := 0 TO s.h - 1 DO
+    FOR x := 0 TO s.w - 1 DO
+      i := m[y, x];
+      IF i # iter THEN
+        i := FLOOR(i * shine);
+        IF i > 255 THEN i := 255 END;
+        CASE col OF
+          0: i := G.MakeCol(i, 0, 0)
+        | 1: i := G.MakeCol(i, i DIV 3, 0)
+        | 2: i := G.MakeCol(i, i, 0)
+        | 3: i := G.MakeCol(0, i, 0)
+        | 4: i := G.MakeCol(0, i DIV 2, i)
+        | 5: i := G.MakeCol(0, 0, i)
+        ELSE i := G.MakeCol(i * 2 DIV 4, 0, i * 2 DIV 4)
+        END;
+        G.PutPixel(s, x, y, i)
+      END
+    END
+  END
+END Draw;
+
+PROCEDURE Do;
+VAR x, y: INTEGER;
+  x0, y0, x1, y1: REAL;
+BEGIN G.Settings(0, 0, {G.fullscreen});
+  s := G.Init(); G.Flip; NEW(m, s.h, s.w);
+  x0 := -0.63; x1 := -0.61; y0 := -0.45; y1 := -0.47;
+  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;
+  angle := 0; col := 0;
+  REPEAT Draw; angle := angle + M.pi / 360;
+    IF angle > M.pi * 2 THEN
+      angle := angle - M.pi * 2;
+      col := (col + 1) MOD 7;
+    END;
+    G.Flip; G.Delay(10)
+  UNTIL G.KeyPressed();
+  G.Close
+END Do;
+
+BEGIN
+  Do
+END Mandelbrot2.
+