commit 22818513792d88d305d0e3c769cabcef4f110969
parent f7ea670c56c214552b33b32fd1e9a417ece843f6
Author: zerous Naveen Narayanan <zerous@nocebo.space>
Date: Fri, 1 Mar 2019 01:32:45 +0100
Add exercise 1.6 solution
Diffstat:
A | exercise-1-6.go | | | 59 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 59 insertions(+), 0 deletions(-)
diff --git a/exercise-1-6.go b/exercise-1-6.go
@@ -0,0 +1,59 @@
+package main
+
+import (
+ "image"
+ "image/color"
+ "image/gif"
+ "io"
+ "math"
+ "math/rand"
+ "os"
+)
+
+var palette = []color.Color{color.RGBA{0x25, 0x5C, 0x1c, 0xff},
+ color.RGBA{0x00, 0x00, 0x00, 0xff},
+ color.RGBA{0x3B, 0x3B, 0x71, 0xff}}
+
+const (
+ greenIndex = 0
+ blackIndex = 1
+ blueIndex = 2
+)
+
+func main() {
+ lissajous(os.Stdout)
+}
+
+func lissajous(out io.Writer) {
+ const (
+ cycles = 5
+ res = 0.001
+ size = 100
+ nframes = 64
+ delay = 8
+ )
+ freq := rand.Float64() * 3.0
+ anim := gif.GIF{LoopCount: nframes}
+ phase := 0.0
+ for i := 0; i < nframes; i++ {
+ rect := image.Rect(0, 0, 2*size+1, 2*size+1)
+ img := image.NewPaletted(rect, palette)
+ for t := 0.0; t < cycles*2*math.Pi; t += res {
+ x := math.Sin(t)
+ y := math.Sin(t*freq + phase)
+ if t < cycles*2*math.Pi/2 {
+ img.SetColorIndex(size+int(x*size+0.5),
+ size+int(y*size+0.5),
+ blackIndex)
+ } else {
+ img.SetColorIndex(size+int(x*size+0.5),
+ size+int(y*size+0.5),
+ blueIndex)
+ }
+ }
+ phase += 0.1
+ anim.Delay = append(anim.Delay, delay)
+ anim.Image = append(anim.Image, img)
+ }
+ gif.EncodeAll(out, &anim)
+}