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