1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
   | package main
  import ( 	"image" 	"image/color" 	"image/gif" 	"io" 	"log" 	"math" 	"math/rand" 	"net/http" 	"os" 	"time" )
  var palette = []color.Color{color.Black, color.RGBA{199, 237, 204, 0xff}, color.RGBA{102, 53, 204, 0xff}}
 
  func main() { 	rand.Seed(time.Now().UTC().UnixNano()) 	 	if len(os.Args) > 1 && os.Args[1] == "web" { 		handler := func(w http.ResponseWriter, r *http.Request) { 			lissajous(w) 		} 		http.HandleFunc("/", handler) 		log.Fatal(http.ListenAndServe("localhost:8000", nil)) 		return 	} 	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 index,i :=0, 1; 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) 			img.SetColorIndex(size+int(x*size+0.5), size+int(y*size+0.5), uint8(index)) 		} 		 		index = i % 3 		phase += 0.1 		anim.Delay = append(anim.Delay, delay) 		anim.Image = append(anim.Image, img) 	} 	gif.EncodeAll(out, &anim)  	 	 	 }
   |