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  |