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" )
var palette = []color.Color{color.RGBA{0x3D, 0x91, 0x40, 0xff}, color.RGBA{0x29, 0x24, 0x21, 0xff}} const ( whiteIndex = 0 blackIndex = 1 )
func main() { 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 i := 0; i < nframes; i++{ rect := image.Rect(0, 0, 2 * size + 1, 2 * size + 1) img := image.NewPaletted(rect, palette) tmp := uint8(1) 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), tmp) } phase += 0.1 tmp += 1 tmp %= 2 anim.Delay = append(anim.Delay, delay) anim.Image = append(anim.Image, img) } gif.EncodeAll(out, &anim) }
|