equal
deleted
inserted
replaced
1 // Mandelbrot pictures |
1 // Mandelbrot pictures |
2 //===================== |
2 //===================== |
3 // |
3 // |
4 // see https://en.wikipedia.org/wiki/Mandelbrot_set |
4 // see https://en.wikipedia.org/wiki/Mandelbrot_set |
5 // |
5 // |
6 // under scala 2.13.XX needs to be called with |
6 // under scala 3.2.2 needs to be called with |
7 // |
7 // |
8 // scala -cp scala-parallel-collections_2.13-0.2.0.jar mandelbrot.scala |
8 // scala -cp scala-parallel-collections_3-1.0.4.jar |
|
9 // |
|
10 // !! UPDATE: On my faster Mac-M1 machine the times |
|
11 // !! are ca. 4 secs for the sequential version and |
|
12 // !! around 0.7 secs for the par-version. |
|
13 |
9 |
14 |
10 import java.awt.Color |
15 import java.awt.Color |
11 import java.awt.Dimension |
16 import java.awt.Dimension |
12 import java.awt.Graphics |
17 import java.awt.Graphics |
13 import java.awt.Graphics2D |
18 import java.awt.Graphics2D |
29 def abs() = Math.sqrt(this.re * this.re + this.im * this.im) |
34 def abs() = Math.sqrt(this.re * this.re + this.im * this.im) |
30 } |
35 } |
31 |
36 |
32 // to allow the notation n + m * i |
37 // to allow the notation n + m * i |
33 object i extends Complex(0, 1) |
38 object i extends Complex(0, 1) |
34 implicit def double2complex(re: Double) = Complex(re, 0) |
39 |
|
40 // implicit conversion from Doubles to Complex |
|
41 given Conversion[Double, Complex] = Complex(_, 0) |
35 |
42 |
36 |
43 |
37 // some customn colours for the "sliding effect" |
44 // some customn colours for the "sliding effect" |
38 val colours = List( |
45 val colours = List( |
39 new Color(66, 30, 15), new Color(25, 7, 26), |
46 new Color(66, 30, 15), new Color(25, 7, 26), |
102 |
109 |
103 // deltas for each grid step |
110 // deltas for each grid step |
104 val d_x = (end.re - start.re) / W |
111 val d_x = (end.re - start.re) / W |
105 val d_y = (end.im - start.im) / H |
112 val d_y = (end.im - start.im) / H |
106 |
113 |
107 for (y <- (0 until H).par) { |
114 for (y <- (0 until H)) { |
108 for (x <- (0 until W).par) { |
115 for (x <- (0 until W)) { |
109 |
116 |
110 val c = start + |
117 val c = start + |
111 (x * d_x + y * d_y * i) |
118 (x * d_x + y * d_y * i) |
112 val iters = iterations(c, max) |
119 val iters = iterations(c, max) |
113 val col = |
120 val colour = |
114 if (iters == max) black |
121 if (iters == max) black |
115 else colours(iters % 16) |
122 else colours(iters % 16) |
116 |
123 |
117 pixel(x, y, col) |
124 pixel(x, y, colour) |
118 } |
125 } |
119 viewer.updateUI() |
126 viewer.updateUI() |
120 } |
127 } |
121 } |
128 } |
122 |
129 |