Mandelbrot2.Mod 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. MODULE Mandelbrot2;
  2. IMPORT G := Graph, M := Math;
  3. CONST iter = 768;
  4. VAR s: G.Bitmap;
  5. col: INTEGER;
  6. m: POINTER TO ARRAY OF ARRAY OF INTEGER;
  7. angle: REAL;
  8. PROCEDURE Go(sx, sy: INTEGER; x, y: REAL);
  9. VAR col, i: INTEGER;
  10. re, im, re2: REAL;
  11. BEGIN re := x; im := y; i := 0;
  12. REPEAT re2 := re * re - im * im;
  13. im := 2 * re * im; re := re2;
  14. re := re + x; im := im + y; INC(i)
  15. UNTIL (i = iter) OR (re * re + im * im > 4);
  16. m[sy, sx] := i
  17. END Go;
  18. PROCEDURE Draw;
  19. VAR i, x, y: INTEGER;
  20. shine: REAL;
  21. BEGIN shine := (1 - M.cos(angle)) * 1;
  22. FOR y := 0 TO s.h - 1 DO
  23. FOR x := 0 TO s.w - 1 DO
  24. i := m[y, x];
  25. IF i # iter THEN
  26. i := FLOOR(i * shine);
  27. IF i > 255 THEN i := 255 END;
  28. CASE col OF
  29. 0: i := G.MakeCol(i, 0, 0)
  30. | 1: i := G.MakeCol(i, i DIV 3, 0)
  31. | 2: i := G.MakeCol(i, i, 0)
  32. | 3: i := G.MakeCol(0, i, 0)
  33. | 4: i := G.MakeCol(0, i DIV 2, i)
  34. | 5: i := G.MakeCol(0, 0, i)
  35. ELSE i := G.MakeCol(i * 2 DIV 4, 0, i * 2 DIV 4)
  36. END;
  37. G.PutPixel(s, x, y, i)
  38. END
  39. END
  40. END
  41. END Draw;
  42. PROCEDURE Do;
  43. VAR x, y: INTEGER;
  44. x0, y0, x1, y1: REAL;
  45. BEGIN G.Settings(0, 0, {G.fullscreen});
  46. s := G.Init(); G.Flip; NEW(m, s.h, s.w);
  47. x0 := -0.63; x1 := -0.61; y0 := -0.45; y1 := -0.47;
  48. FOR y := 0 TO s.h - 1 DO
  49. FOR x := 0 TO s.w - 1 DO
  50. Go(x, y, x0 + x / (s.w - 1) * (x1 - x0),
  51. y0 + y / (s.h - 1) * (y1 - y0))
  52. END
  53. END;
  54. angle := 0; col := 0;
  55. REPEAT Draw; angle := angle + M.pi / 90;
  56. IF angle > M.pi * 2 THEN
  57. angle := angle - M.pi * 2;
  58. col := (col + 1) MOD 7;
  59. END;
  60. G.Flip; G.Delay(10)
  61. UNTIL G.KeyPressed();
  62. G.Close
  63. END Do;
  64. BEGIN
  65. Do
  66. END Mandelbrot2.