From 3832bef23e6f67b4267424d8d82e2211142a311a Mon Sep 17 00:00:00 2001 From: Igor V Belousov Date: Tue, 14 Dec 2021 22:44:10 +0300 Subject: [PATCH] Chapter 1 - Practice 1.12 (gif lissajous http server) --- ch1/server_1_12.go | 63 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 ch1/server_1_12.go diff --git a/ch1/server_1_12.go b/ch1/server_1_12.go new file mode 100644 index 0000000..73f54f5 --- /dev/null +++ b/ch1/server_1_12.go @@ -0,0 +1,63 @@ +package main + +import ( + "image" + "image/color" + "image/gif" + "io" + "log" + "math" + "math/rand" + "net/http" + "strconv" + "time" +) + +var palette = []color.Color{color.White, color.Black} + +const ( + whiteIndex = 0 // Первый цвет палитры + blackIndex = 1 // Следующий цвет палитры +) + +func lissajous(out io.Writer, cycles float64) { + const ( + res = 0.001 // Угловое разрешение + size = 100 // Канва изобрадения охватывает [size..+size] + nframes = 64 // Количество кадро анимации + delay = 8 // Задержка между кадрами (единица - 10мс) + ) + rand.Seed(time.Now().UTC().UnixNano()) + 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) + 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), blackIndex) + } + phase += 0.1 + anim.Delay = append(anim.Delay, delay) + anim.Image = append(anim.Image, img) + } + gif.EncodeAll(out, &anim) +} + +// Обработчик возвращает компонент пути из URL запроса. +func handler(w http.ResponseWriter, r *http.Request) { + cycles := 5.0 + + cyclesFromForm, err := strconv.ParseFloat(r.FormValue("cycles"), 64) + if err == nil { + cycles = cyclesFromForm + } + lissajous(w, cycles) +} + +func main() { + http.HandleFunc("/", handler) + log.Fatal(http.ListenAndServe("0.0.0.0:8888", nil)) +}