|
1 // Mandelbrot pictures |
|
2 // see https://en.wikipedia.org/wiki/Mandelbrot_set |
|
3 |
1 import java.awt.Color |
4 import java.awt.Color |
2 import java.awt.Dimension |
5 import java.awt.Dimension |
3 import java.awt.Graphics |
6 import java.awt.Graphics |
4 import java.awt.Graphics2D |
7 import java.awt.Graphics2D |
5 import java.awt.image.BufferedImage |
8 import java.awt.image.BufferedImage |
17 this.re * that.im + that.re * this.im) |
20 this.re * that.im + that.re * this.im) |
18 def *(that: Double) = Complex(this.re * that, this.im * that) |
21 def *(that: Double) = Complex(this.re * that, this.im * that) |
19 def abs() = Math.sqrt(this.re * this.re + this.im * this.im) |
22 def abs() = Math.sqrt(this.re * this.re + this.im * this.im) |
20 } |
23 } |
21 |
24 |
|
25 // to allow the notation n + m * i |
22 object i extends Complex(0, 1) |
26 object i extends Complex(0, 1) |
|
27 implicit def double2complex(re: Double) = Complex(re, 0) |
23 |
28 |
24 implicit def double2complex(re: Double): Complex = Complex(re, 0) |
|
25 |
29 |
26 // some customn colours for the "sliding effect" |
30 // some customn colours for the "sliding effect" |
27 val colours = List( |
31 val colours = List( |
28 new Color(66, 30, 15), new Color(25, 7, 26), |
32 new Color(66, 30, 15), new Color(25, 7, 26), |
29 new Color(9, 1, 47), new Color(4, 4, 73), |
33 new Color(9, 1, 47), new Color(4, 4, 73), |
82 def pred(z: Complex) = z.abs < 2 // exit condition |
86 def pred(z: Complex) = z.abs < 2 // exit condition |
83 Stream.iterate(0.0 * i, max)(next).takeWhile(pred).size |
87 Stream.iterate(0.0 * i, max)(next).takeWhile(pred).size |
84 } |
88 } |
85 |
89 |
86 // main function |
90 // main function |
|
91 // start and end are the upper-left and lower right corners |
|
92 // max is the number of maximum iterations |
87 def mandelbrot(start: Complex, end: Complex, max: Int) : Unit = { |
93 def mandelbrot(start: Complex, end: Complex, max: Int) : Unit = { |
88 viewer.clearCanvas(black) |
94 viewer.clearCanvas(black) |
89 |
95 |
90 // deltas for each grid step |
96 // deltas for each grid step |
91 val d_x = (end.re - start.re) / W |
97 val d_x = (end.re - start.re) / W |
92 val d_y = (end.im - start.im) / H |
98 val d_y = (end.im - start.im) / H |
93 |
99 |
94 for (y <- (0 until H).par) { |
100 for (y <- (0 until H)) { |
95 for (x <- (0 until W).par) { |
101 for (x <- (0 until W)) { |
96 |
102 |
97 val c = start + |
103 val c = start + |
98 (x * d_x + y * d_y * i) |
104 (x * d_x + y * d_y * i) |
99 val iters = iterations(c, max) |
105 val iters = iterations(c, max) |
100 val col = |
106 val col = |