Advertisement
PavelZhdanov

Untitled

Feb 5th, 2019
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.26 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "image"
  6.     "image/color"
  7.     "image/gif"
  8.     "io"
  9.     "log"
  10.     "math"
  11.     "math/rand"
  12.     "net/http"
  13.     "strconv"
  14.     "sync"
  15.     "time"
  16. )
  17.  
  18. var mu sync.Mutex
  19. var count int
  20. var palette = []color.Color{color.White, color.Black}
  21.  
  22. const (
  23.     whiteIndex = 0
  24.     blackIndex = 1
  25. )
  26.  
  27. func main() {
  28.     http.HandleFunc("/", handler)
  29.     http.HandleFunc("/count", counter)
  30.     http.HandleFunc("/lissaju", func(w http.ResponseWriter, r *http.Request) {
  31.  
  32.         if err := r.ParseForm(); err != nil {
  33.             log.Print(err)
  34.         }
  35.         cyc := 5.0
  36.         del := 5
  37.         for k, v := range r.Form {
  38.             if k == "cycle" {
  39.                 i, err := strconv.Atoi(v[0])
  40.                 if err != nil {
  41.                     fmt.Printf("Error")
  42.                 } else {
  43.                     cyc = float64(i)
  44.                 }
  45.  
  46.             }
  47.  
  48.             if k == "delay" {
  49.                 i, err := strconv.Atoi(v[0])
  50.                 if err != nil {
  51.                     fmt.Printf("Error")
  52.                 } else {
  53.                     del = i
  54.                 }
  55.  
  56.             }
  57.         }
  58.         lissajous(w, cyc, del)
  59.     })
  60.     log.Fatal(http.ListenAndServe("localhost:8000", nil))
  61. }
  62.  
  63. func counter(w http.ResponseWriter, r *http.Request) {
  64.     mu.Lock()
  65.     fmt.Fprintf(w, "counter= %d\n", count)
  66.     mu.Unlock()
  67. }
  68.  
  69. func handler(w http.ResponseWriter, r *http.Request) {
  70.  
  71.     mu.Lock()
  72.     count++
  73.     mu.Unlock()
  74.  
  75.     fmt.Fprintf(w, "%s %s %s\n", r.Method, r.URL, r.Proto)
  76.     for k, v := range r.Header {
  77.         fmt.Fprintf(w, "Header[%q] = %q\n", k, v)
  78.     }
  79.     fmt.Fprintf(w, "Host = %q\n", r.Host)
  80.     fmt.Fprintf(w, "RemoteAddr = %q\n", r.RemoteAddr)
  81.     if err := r.ParseForm(); err != nil {
  82.         log.Print(err)
  83.     }
  84.     for k, v := range r.Form {
  85.         fmt.Fprintf(w, "Form[%q] = %q\n", k, v)
  86.     }
  87. }
  88.  
  89. func lissajous(out io.Writer, cyc float64, del int) {
  90.  
  91.     cycles := cyc
  92.     delay := del
  93.  
  94.     const (
  95.         res     = 0.001
  96.         size    = 400
  97.         nframes = 100
  98.     )
  99.  
  100.     rand.Seed(time.Now().UTC().UnixNano())
  101.     freq := rand.Float64() * 3.0
  102.     anim := gif.GIF{LoopCount: nframes}
  103.  
  104.     phase := 0.0
  105.     for i := 0; i < nframes; i++ {
  106.         rect := image.Rect(0, 0, 2*size+1, 2*size+1)
  107.         img := image.NewPaletted(rect, palette)
  108.         for t := 0.0; t < cycles*2*math.Pi; t += res {
  109.             x := math.Sin(t)
  110.             y := math.Sin(t*freq + phase)
  111.             img.SetColorIndex(size+int(x*size+0.5), size+int(y*size+0.5), blackIndex)
  112.         }
  113.         phase += 0.1
  114.         anim.Delay = append(anim.Delay, delay)
  115.         anim.Image = append(anim.Image, img)
  116.     }
  117.     gif.EncodeAll(out, &anim)
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement