install.packages("TurtleGraphics")むかしむかし、MZ-731のプロッタプリンタでタートルグラフィックスを描かせていたことをふと思い出しました。で、調べてみるとRにもTurtleGraphicsというパッケージがあることがわかりました。さっそく試してみます。
インストール
CRANにあるので、ふつうにinstall.packagesでインストールできます。
動かしてみる
まず、library(TurtleGraphics)で、パッケージを読み込みます。
次に、turtle_init関数で描画領域を作成します。mode引数は、カメが領域からはみ出したときの処理を指定します。“clip”, “error”, “cycle”のいずれかで、それぞれクリップ、エラー、反対側に出る、となるようです。
カメは初期状態では領域の中央で上向きにいます。
library(TurtleGraphics)
## Loading required package: grid
turtle_init(width = 512, height = 512, mode = "clip")
turtle_forwardで前進、turtle_backwardで交代、turtle_leftで左に回転、turtle_rightで右回転します。
カメが動いて軌跡に線が引かれます。
turtle_init(width = 512, height = 512, mode = "clip")
turtle_forward(100)





turtle_right(30)





turtle_backward(100)





コッホ雪片
むかしもやっていた、再起関数を定義してフラクタル曲線を描くということをやってみます。
ということで、定番のコッホ雪片を描画してみます。まずはコッホ曲線を描画する関数を定義します。
koch <- function(length = 90, level = 4) {
if (length <= 0) {
stop("`length` must be larger than 0.")
}
if (level <= 1) {
turtle_forward(length)
} else {
koch(length / 3, level - 1)
turtle_left(60)
koch(length / 3, level - 1)
turtle_right(120)
koch(length / 3, level - 1)
turtle_left(60)
koch(length / 3, level - 1)
}
}コッホ曲線を描画するところをアニメーションにしました。
library(magick)
## Linking to ImageMagick 6.9.13.29
## Enabled features: cairo, fontconfig, freetype, heic, lcms, pango, raw, rsvg, webp
## Disabled features: fftw, ghostscript, x11
img_dir <- "images"
png(filename = file.path(img_dir, "koch%03d.png"))
turtle_init(480, 480, "clip")
turtle_up()
turtle_goto(240, 120)
turtle_down()
koch(210, 3)
dev.off()
## quartz_off_screen
## 2
images <- list.files(img_dir, "^koch[0-9]+\\.png$", full.names = TRUE) |>
image_read()
animation <- image_animate(images, fps = 20)
image_write(animation, file.path(img_dir, "koch.mp4"), format = "mp4")
unlink(file.path(img_dir, "koch*.png"))コッホ雪片を描画します。turtle_do関数を使うと、途中経過なしで一気に描画しますが、最初のカメは残ってしまうので、最終的な出力だけをPNGに出力するようにしました。
png(file.path(img_dir, "snowflake.png"),
width = 512, height = 512, units = "px")
turtle_init(512, 512, "clip")
# hide turtle
turtle_hide()
turtle_do({
# move to the start point
turtle_up()
turtle_left(60)
turtle_forward(200)
turtle_right(150)
turtle_down()
# draw
koch(360, 6)
turtle_right(120)
koch(360, 6)
turtle_right(120)
koch(360, 6)
})
dev.off()
## quartz_off_screen
## 2
ドラゴン曲線
次に、これもフラクタル曲線のドラゴン曲線を描きます。まず関数を定義します。
dragon <- function(length = 90, level = 4, sign = 1) {
if (length <= 0) {
stop("`length` must be larger than 0.")
}
if (level <= 1) {
turtle_forward(length)
} else {
turtle_right(45 * sign)
dragon(length / sqrt(2), level - 1, 1)
turtle_left(90 * sign)
dragon(length / sqrt(2), level - 1, -1)
turtle_right(45 * sign)
}
}描画します。こちらも最終的な出力をPNGに出力しています。
png(file.path(img_dir, "dragon.png"),
width = 512, height = 512, units = "px")
turtle_init(512, 512, "clip")
# hide turtle
turtle_hide()
turtle_do({
# move to the start point
turtle_up()
turtle_goto(208, 144)
turtle_down()
# draw
dragon(256, 12)
})
dev.off()
## quartz_off_screen
## 2