Mandelbrot2.Mod 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. MODULE Mandelbrot2;
  2. IMPORT G := Graph, M := Math, Random;
  3. CONST iter = 768;
  4. VAR col, W, H: INTEGER;
  5. m: POINTER TO ARRAY OF ARRAY OF INTEGER;
  6. angle: REAL;
  7. PROCEDURE Go(sx, sy: INTEGER; x, y: REAL);
  8. VAR col, i: INTEGER;
  9. re, im, re2: REAL;
  10. BEGIN re := x; im := y; i := 0;
  11. REPEAT re2 := re * re - im * im;
  12. im := 2.0 * re * im; re := re2;
  13. re := re + x; im := im + y; INC(i)
  14. UNTIL (i = iter) OR (re * re + im * im > 4.0);
  15. m[sy, sx] := i
  16. END Go;
  17. PROCEDURE Draw;
  18. VAR i, x, y: INTEGER;
  19. shine: REAL;
  20. c: G.Color;
  21. BEGIN shine := 1.0 - M.cos(angle);
  22. FOR y := 0 TO H - 1 DO
  23. FOR x := 0 TO W - 1 DO
  24. i := m[y, x];
  25. IF i # iter THEN
  26. i := FLOOR(FLT(i) * shine);
  27. IF i > 255 THEN i := 255 END;
  28. CASE col OF
  29. 0: G.MakeCol(c, i, 0, 0)
  30. | 1: G.MakeCol(c, i, i DIV 3, 0)
  31. | 2: G.MakeCol(c, i, i, 0)
  32. | 3: G.MakeCol(c, 0, i, 0)
  33. | 4: G.MakeCol(c, 0, i DIV 2, i)
  34. | 5: G.MakeCol(c, 0, 0, i)
  35. | 6: G.MakeCol(c, i * 2 DIV 4, 0, i * 2 DIV 4)
  36. END;
  37. G.PutPixel(x, y, c)
  38. END
  39. END
  40. END
  41. END Draw;
  42. PROCEDURE Set(cx, cy, r: REAL);
  43. VAR x, y: INTEGER;
  44. x0, y0, x1, y1: REAL;
  45. BEGIN
  46. x0 := cx - r; x1 := cx + r;
  47. y0 := cy + r * FLT(H) / FLT(W); y1 := 2.0 * cy - y0;
  48. y := 0;
  49. WHILE (y < H) & ~G.KeyPressed() DO
  50. FOR x := 0 TO W - 1 DO
  51. Go(x, y, x0 + x / (W - 1) * (x1 - x0),
  52. y0 + y / (H - 1) * (y1 - y0))
  53. END;
  54. INC(y)
  55. END
  56. END Set;
  57. PROCEDURE Do;
  58. VAR x, y, r: REAL;
  59. BEGIN G.Settings(320, 200, {G.exact});
  60. G.Init; G.Flip; G.GetScreenSize(W, H); NEW(m, H, W);
  61. x := -0.619; y := -0.456; r := 0.1;
  62. Set(x, y, r);
  63. angle := 0.0; col := 0;
  64. REPEAT Draw; angle := angle + M.pi / 45.0;
  65. IF angle > M.pi * 2.0 THEN
  66. angle := 0.0;
  67. col := (col + 1) MOD 7;
  68. G.ClearScreen; G.Flip;
  69. r := r / 2.0;
  70. Set(x, y, r)
  71. ELSE G.Flip; G.Delay(10)
  72. END
  73. UNTIL G.KeyPressed();
  74. G.Close
  75. END Do;
  76. BEGIN
  77. Do
  78. END Mandelbrot2.