Exercise 1-6
[goproglang.git] / lissajous / lissajous.go
1 package main
2
3 import (
4   // "fmt"
5   "image"
6   "image/color"
7   "image/gif"
8   "io"
9   "math"
10   "math/rand"
11   "os"
12   "time"
13 )
14
15 var palette = []color.Color{color.RGBA{0x00,0x16,0x00,0xff}, color.Black, color.White}
16
17 const (
18   whiteIndex = 2
19   blackIndex = 1
20   greenIndex = 0
21 )
22 func main() {
23   rand.Seed(time.Now().UnixNano())
24   paletteIndex := uint8 (rand.Intn(2))
25   // fmt.Println("paletteIndex: ", paletteIndex)
26   lissajous(os.Stdout, paletteIndex)
27 }
28 func lissajous(out io.Writer, paletteIndex uint8) {
29   const (
30     cycles = 5
31     res = 0.001
32     size = 100
33     nframes = 64
34     delay = 8
35   )
36   freq := rand.Float64() * 3.0
37   anim := gif.GIF{LoopCount: nframes}
38   phase := 0.0
39   for i := 0; i < nframes; i++ {
40     rect := image.Rect(0, 0, 2*size+1, 2*size+1)
41     img := image.NewPaletted(rect, palette)
42     for t:= 0.0; t < cycles*2*math.Pi; t += res {
43       x := math.Sin(t)
44       y := math.Sin(t*freq + phase)
45       img.SetColorIndex(size+int(x*size+0.5), size+int(y*size+0.5), paletteIndex)
46     }
47     phase += 1
48     anim.Delay = append(anim.Delay, delay)
49     anim.Image = append(anim.Image, img)
50   }
51   gif.EncodeAll(out, &anim)
52 }
53
54 /* Exercise 1.6: Modify the Lissajous program to produce images in multiple colors by adding
55    more values to palette and then displaying them by changing the third argument of SetColorindex 
56    in some interesting way
57 */