-
Notifications
You must be signed in to change notification settings - Fork 0
/
mandelbrot.go
70 lines (63 loc) · 1.37 KB
/
mandelbrot.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package main
import (
"fmt"
"image"
"image/png"
"os"
)
func main() {
err := mandelbrot(complex(-2.0, -1.0), complex(3.0, 2.0), 500.0)
if err != nil {
fmt.Println("Error: ", err.Error())
} else {
fmt.Println("Done!")
}
}
func escapeTime(c complex128, limit uint8) uint8 {
var z complex128 = complex(0.0, 0.0)
var i uint8
for i = 0; i < limit; i++ {
z = z*z + c
if real(z)*real(z)+imag(z)*imag(z) > 4.0 {
return i
}
}
return limit
}
func mandelbrot(
z_offset complex128,
z_range complex128,
res float64,
) error {
var width uint64 = uint64(res * real(z_range))
var height uint64 = uint64(res * imag(z_range))
var matrix []uint8 = make([]uint8, width*height)
var row uint64
var col uint64
for row = 0; row < height; row++ {
for col = 0; col < width; col++ {
c := z_offset + complex(float64(col)/res, float64(row)/res)
matrix[col+width*row] = uint8(escapeTime(c, 100) * 2)
}
}
img := image.Gray{
Pix: matrix,
Stride: int(width),
Rect: image.Rectangle{
Min: image.Point{X: 0, Y: 0},
Max: image.Point{X: int(width), Y: int(height)},
},
}
f, err := os.Create("mandelbrot.png")
if err != nil {
fmt.Println("Error: could not create image file: ", err.Error())
return err
}
defer f.Close()
err = png.Encode(f, &img)
if err != nil {
fmt.Println("Error: could not create image file: ", err.Error())
return err
}
return nil
}