summaryrefslogtreecommitdiffstats
path: root/mandelbrot.go
diff options
context:
space:
mode:
Diffstat (limited to 'mandelbrot.go')
-rw-r--r--mandelbrot.go93
1 files changed, 93 insertions, 0 deletions
diff --git a/mandelbrot.go b/mandelbrot.go
new file mode 100644
index 0000000..27d7bdb
--- /dev/null
+++ b/mandelbrot.go
@@ -0,0 +1,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))
+}