summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRose Hogenson <rosehogenson@posteo.net>2023-08-27 18:01:10 -0700
committerRose Hogenson <rosehogenson@posteo.net>2023-08-27 18:01:10 -0700
commitb1e2961e1df83c55f79d0f7d5cf924256252e213 (patch)
tree73b7b88e2ed2150d4359892ae28992ba8c10e8bb
downloadmandelbrot-b1e2961e1df83c55f79d0f7d5cf924256252e213.tar.zst
Write a god-awful Mandelbrot set program.
-rw-r--r--.gitignore1
-rw-r--r--flake.lock25
-rw-r--r--flake.nix17
-rw-r--r--go.mod7
-rw-r--r--go.sum4
-rw-r--r--mandelbrot.go93
6 files changed, 147 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c4a847d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/result
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..a928af0
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,25 @@
+{
+ "nodes": {
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1693145325,
+ "narHash": "sha256-Gat9xskErH1zOcLjYMhSDBo0JTBZKfGS0xJlIRnj6Rc=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "cddebdb60de376c1bdb7a4e6ee3d98355453fe56",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "type": "indirect"
+ }
+ },
+ "root": {
+ "inputs": {
+ "nixpkgs": "nixpkgs"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..1b1fb35
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,17 @@
+{
+ outputs = { self, nixpkgs }:
+ let pkgs = nixpkgs.legacyPackages.x86_64-linux; in
+ rec {
+
+ packages.x86_64-linux.mandelbrot = pkgs.buildGoModule {
+ pname = "mandelbrot";
+ version = "1.0";
+
+ src = self;
+
+ vendorHash = "sha256-WiEK8nq13mdTFnyxDiMRWM1tb60mlZY0fVmtlH5ZWgw=";
+ };
+
+ defaultPackage.x86_64-linux = packages.x86_64-linux.mandelbrot;
+ };
+}
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..8e82360
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,7 @@
+module mandelbrot
+
+go 1.20
+
+require golang.org/x/term v0.11.0
+
+require golang.org/x/sys v0.11.0 // indirect
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..6aed7b2
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,4 @@
+golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
+golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0=
+golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
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))
+}