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
|
package main
import (
"fmt"
"math/big"
"time"
)
var rat4 = big.NewRat(4, 1)
func mandelbrot(x0, y0 *big.Rat) int {
x := new(big.Rat)
y := new(big.Rat)
x2 := new(big.Rat)
y2 := new(big.Rat)
temp := new(big.Rat)
i := 0
for ; temp.Add(x2, y2).Cmp(rat4) <= 0; i++ {
y.Add(y, y).Mul(y, x).Add(y, y0)
x.Sub(x2, y2).Add(x, x0)
x2.Mul(x, x)
y2.Mul(y, y)
}
return (i-1)%6 + 1
}
func printMandelbrot(xMin, xRange, yMin, yRange *big.Rat) error {
const (
width = 80
height = 25
)
grid := make([]int, width*height)
xStep := new(big.Rat).Quo(xRange, big.NewRat(int64(width), 1))
yStep := new(big.Rat).Quo(yRange, big.NewRat(int64(height), 1))
y := new(big.Rat)
x := new(big.Rat)
y.Set(yMin)
for i := 0; i < height; i++ {
x.Set(xMin)
for j := 0; j < width; j++ {
go func(i, j int, x, y *big.Rat) {
grid[i*width+j] = mandelbrot(x, y)
}(i, j, new(big.Rat).Set(x), new(big.Rat).Set(y))
x.Add(x, xStep)
}
y.Add(y, yStep)
}
time.Sleep(time.Minute)
for i := 0; i < height; i++ {
for j := 0; j < width; j++ {
fmt.Printf("\033[%dm ", 40+grid[i*width+j])
}
fmt.Println("\033[49m")
}
return nil
}
func main() {
printMandelbrot(big.NewRat(-3, 2), big.NewRat(247, 100), big.NewRat(-112, 100), big.NewRat(224, 100))
}
|