tgpl

The Go Programming Language - Solutions
Log | Files | Refs

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:
Aexercise-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) +}