97ed49e1cd68e6c26d1f565a6ae31f2333bf74e2
[goproglang.git] / lissajous / lissajous.go
1 package main
2
3 import (
4   "image"
5   "image/color"
6   "image/gif"
7   "io"
8   "math"
9   "math/rand"
10   "os"
11 )
12
13 var palette = []color.Color{color.RGBA{0x00,0x16,0x00,0xff}, color.Black}
14
15 const (
16   whiteIndex = 0
17   blackIndex = 1
18 )
19 func main() {
20   lissajous(os.Stdout)
21 }
22 func lissajous(out io.Writer) {
23   const (
24     cycles = 5
25     res = 0.001
26     size = 100
27     nframes = 64
28     delay = 8
29   )
30   freq := rand.Float64() * 3.0
31   anim := gif.GIF{LoopCount: nframes}
32   phase := 0.0
33   for i := 0; i < nframes; i++ {
34     rect := image.Rect(0, 0, 2*size+1, 2*size+1)
35     img := image.NewPaletted(rect, palette)
36     for t:= 0.0; t < cycles*2*math.Pi; t += res {
37     x := math.Sin(t)
38     y := math.Sin(t*freq + phase)
39     img.SetColorIndex(size+int(x*size+0.5), size+int(y*size+0.5),
40       blackIndex)
41     }
42     phase += 1
43     anim.Delay = append(anim.Delay, delay)
44     anim.Image = append(anim.Image, img)
45   }
46   gif.EncodeAll(out, &anim)
47 }