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)) }