2019年1月8日火曜日

開発環境

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES) (Alan A.A. Donovan(著)、Brian W. Kernighan(著)、柴田 芳樹(翻訳)、丸善出版)の第1章(チュートリアル)、1.4(GIFアニメーション)、練習問題1.6の解答を求めてみる。

コード

package main

import (
 "fmt"
 "image"
 "image/color"
 "image/gif"
 "io"
 "math"
 "math/rand"
 "os"
 "time"
)

var palette = []color.Color{
 color.RGBA{0, 0, 0, 0xff},
 color.RGBA{0xff, 0, 0, 0xff},
 color.RGBA{0, 0xff, 0, 0xff},
 color.RGBA{0, 0, 0xff, 0xff}}

func main() {
 for _, color := range palette {
  fmt.Println(color)
 }
 rand.Seed(time.Now().UTC().UnixNano())
 for i := 0; i < 10; i++ {
  filename := fmt.Sprintf("sample6_%d.gif", i)
  file, err := os.Create(filename)
  if err != nil {
   fmt.Println(err)
   return
  }
  lissajous(file)
  file.Close()
 }
}

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)
  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(rand.Intn(len(palette)-1)+1))
  }
  phase += 0.1
  anim.Delay = append(anim.Delay, delay)
  anim.Image = append(anim.Image, img)
 }
 gif.EncodeAll(out, &anim)
}

入出力結果(Terminal, cmd(コマンドプロンプト))

$ go run sample6.go
{0 0 0 255}
{255 0 0 255}
{0 255 0 255}
{0 0 255 255}
$

0 コメント:

コメントを投稿

関連コンテンツ