1. kmtoki

    Posted

    kmtoki
Changes in title
+RMagickを使ってGIF生成
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,93 @@
+
+# ビジュアライズしたい。
+[ライフゲーム](http://qiita.com/kumatoki/items/630eafb05209629412ac)
+これをアニメーションするのにターミナルを使い、
+それをttyrecで録画。ttygifでgif生成したのだけど、
+イマイチかくかく。
+ビジュアライズに限れば適当なplotを使えば良いのだろうけど、
+gifも欲しい。ttygifの中身はImageMagickなわけだから、
+直接使ってしまおうと。
+
+# RMagick
+ImageMagickのRuby binding
+
+## make_gif
+一時ファイルにワンフレームごと書き出し、
+最後にそれらをひとつのGIFにまとめる。
+非効率臭い。
+
+```ruby:rmagick_make_gif
+require "RMagick"
+require "tempfile"
+
+def make_gif(name = "", x = 0, y = 0, fps = 0, &d)
+ tfs = (0..fps).map { |n|
+ mi = Magick::Image.new(x,y)
+
+ d.call(mi,n)
+ tf = Tempfile.new(["draw_gif",".gif"])
+ mi.write(tf.path)
+ tf
+ }
+
+ Magick::ImageList.new(*tfs.map(&:path)).tap { |mil|
+ mil.write(name)
+ tfs.each(&:close)
+ }
+end
+```
+
+## lifegame.rb
+
+```ruby
+require "./lifegame.rb"
+require "./rmagick_make_gif"
+
+lg = Lifegame.new(300,300)
+lg.random { (rand(2) + rand(2) + rand(2)) / 3 }
+
+make_gif("lifegame.gif",300,300,100) { |m,n|
+ lg.cells.each_with_index { |cy,iy|
+ cy.each_with_index { |cx,ix|
+ m.pixel_color(ix,iy,"black") if cx == 1
+ }
+ }
+ lg.apply
+}
+```
+
+![出力](https://github.com/kumatoki/screenshots/blob/master/lifegame.gif?raw=true)
+
+## cells
+[一次元セルオートマトン](http://qiita.com/kumatoki/items/76f9c521d87a04a519d0)もついでに。
+ルール90です。
+
+```ruby
+bs = []
+make_gif("cells.gif", 200,100,100) { |m,n|
+ y = 0
+ bs.push(cs.dup)
+ bs.each { |cy|
+ x = 0
+ cy.cells.each { |cx|
+ m.pixel_color(x,y,"black") if cx == 1
+ x += 1
+ }
+ y += 1
+ }
+ cs.apply 90
+}
+```
+
+![出力](https://github.com/kumatoki/screenshots/blob/master/cells.gif?raw=true)
+
+# end
+なぜかループしない。
+手元のquicklookではループしてるのだけど。
+まあいいや。
+
+ターミナルのテキスト表現のボリュームとは桁違いに多く出力できるので、
+この例の場合はこちらを使う方が良いですね。
+
+ここまで書いて、plotutilsというので十分同じことできそうなことを知る。
+後々調べる。