R 有很多种制作动画的方法,一般都是先做出多幅静态图片,再连续播放就可以了。下面这个例子是用 image()
函数做出静态图片,用循环指令来连续播放。
# 康威生命游戏。内容请咨询维基。
require(simecol) # 调用这个扩展包是为了使用其中的 eightneighbours() 函数。
m <- matrix(0, 40, 40)
m[5:35,19:21] <- 1 # 初始条件。0 表示该位置没有细胞,1 表示有细胞。
image(m, col=c("white", "darkgreen"), axes=FALSE) # 白色表示没有细胞,绿色有细胞。
for (i in 1:200) {
nn <- eightneighbours(m)
m.old <- m
m[m.old == 0 & nn == 3] <- 1 # 当周围有三个细胞时该位置产生细胞。
m[m.old == 1 & (nn < 2 | nn > 3)] <- 0 # 当周围细胞少于 2 个(太孤单)或大于 3 个(太拥挤)时,该位置细胞死亡。
image(m, col=c("white", "darkgreen"), axes=FALSE)
Sys.sleep(0.1)
}
看到有趣的动画了吧?那么如何保存下来呢?只要在作图前后增加打开和关闭图片的函数就可以了,比如存成png格式的图片:
png(paste("c:\\R\\data\\conway_", formatC(i, width = 2, flag = "0"), ".png", sep = ""), width = 300, height = 300)
image(m, col=c("white", "darkgreen"), axes = FALSE)
dev.off()
然后用其他免费软件,比如ffmpeg或者imagemagick,把图片连成动画即可。
如果安装了imagemagick,那么三维动画可以用 rgl 扩展包做出来。
require(rgl)
x <- sort(rnorm(1000))
y <- rnorm(1000)
z <- rnorm(1000) + atan2(x,y)
plot3d(x, y, z, col = rainbow(1000), type = "s", size = 1, alpha = 0.5) # 作图。
movie3d(spin3d(axis = c(0, 0, 1), rpm = 6), movie = "c:\\R\\data\\movie", duration = 10, clean = TRUE) # 先做出一系列图片,再调用 imagemagick 生成动画。
这就是图 00.2 的来历。
( 连载中,待续 )