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