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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
package main
import (
"fmt"
"golang.org/x/term"
"log"
"math/big"
"time"
)
type color int
const (
black color = iota
red
yellow
green
cyan
blue
magenta
)
func (c color) print() {
var i int
switch c {
case red:
i = 41
case yellow:
i = 43
case green:
i = 42
case cyan:
i = 46
case blue:
i = 44
case magenta:
i = 45
default:
i = 40
}
if _, err := fmt.Printf("\033[%dm ", i); err != nil {
log.Fatal(err)
}
}
var rat2 = big.NewRat(2, 1)
func mandelbrot(x0, y0 *big.Rat) color {
x := new(big.Rat)
y := new(big.Rat)
x2 := new(big.Rat)
y2 := new(big.Rat)
i := 0
for ; x2.Cmp(rat2) <= 0 && y2.Cmp(rat2) <= 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 color(i-1)%magenta + 1
}
func printMandelbrot(xMin, xRange, yMin, yRange *big.Rat) {
width, height, err := term.GetSize(0)
if err != nil {
log.Fatalf("Terminal size: %s.", err)
}
xStep := new(big.Rat).Quo(xRange, big.NewRat(int64(width), 1))
yStep := new(big.Rat).Quo(yRange, big.NewRat(int64(height), 1))
grid := make([]color, width*height)
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 _, c := range grid {
c.print()
}
}
func main() {
printMandelbrot(big.NewRat(-3, 2), big.NewRat(247, 100), big.NewRat(-112, 100), big.NewRat(224, 100))
}
|