1. kmtoki

    No comment

    kmtoki
Changes in body
Source | HTML | Preview
@@ -1,89 +1,87 @@
+
# ビジュアライズしたい。
[ライフゲーム](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.iterations = 10
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ではループしてるのだけど。
-まあいいや。
-
ターミナルのテキスト表現のボリュームとは桁違いに多く出力できるので、
この例の場合はこちらを使う方が良いですね。