LoginSignup
0
0

More than 5 years have passed since last update.

Rで作るシェルピンスキーのカーペット(四角形)

Posted at

ギャスケットコードの改良を機に、シェルピンスキーのカーペットの作図方法を閃いた。

Rで作るシェルピンスキーのカーペット(四角形)

変数xは自然数のみ有効となり、描画する。

main
Sierpinski.carpet <- function(x=3) {    # x = depth
    plot(0,0,main="Sierpinski carpet",xlab=" ",ylab=" ",xaxt="n",yaxt="n")
    y <- c(-1,1, 1,1, 1,-1, -1,-1)     # Set the position
    polygon(c(y[1],y[3],y[5],y[7]),c(y[2],y[4],y[6],y[8]),col="gray")
    if(x > 0) {
        Sierpinski.carpet.square(x-1,y)
    }
}

上記で使用している関数(サブルーチン)

sub
Sierpinski.carpet.square <- function(x,y) {
    xy <- c((y[1]*2+y[3])/3,(y[2]*2+y[8])/3,(y[1]+y[3]*2)/3,(y[4]*2+y[6])/3,(y[5]*2+y[7])/3,(y[4]+y[6]*2)/3,(y[5]+y[7]*2)/3,(y[2]+y[8]*2)/3)
    polygon(c(xy[1],xy[3],xy[5],xy[7]),c(xy[2],xy[4],xy[6],xy[8]),col="white",border=F)  # center
    if(x > 0) {
        Recall(x-1,c(y[1],y[2], xy[1],y[2], xy[1],xy[2], y[1],xy[2]))      # topleft
        Recall(x-1,c(xy[1],y[2], xy[3],y[4], xy[3],xy[4], xy[1],xy[2]))    # top
        Recall(x-1,c(xy[3],y[4], y[3],y[4], y[3],xy[4], xy[3],xy[4]))      # topright
        Recall(x-1,c(xy[3],xy[4], y[3],xy[4], y[5],xy[6], xy[5],xy[6]))    # right
        Recall(x-1,c(xy[5],xy[6], y[5],xy[6], y[5],y[6], xy[5],y[6]))      # bottomright
        Recall(x-1,c(xy[7],xy[8], xy[5],xy[6], xy[5],y[6], xy[7],y[8]))    # bottom
        Recall(x-1,c(y[7],xy[8], xy[7],xy[8], xy[7],y[8], y[7],y[8]))      # bottomleft
        Recall(x-1,c(y[1],xy[2], xy[1],xy[2], xy[7],xy[8], y[7],xy[8]))    # left
    }
}

gif出力

当コードでは左上から時計回りにくり抜く処理をしていく。よって、処理を関数readline()を用いて止めながら取得した画像を繋げると、こうなる。
Sierpinski-carpet_process.gif

余談だが、70枚を超える画像をgifアニメーションにするのは手間だった。
どうにかRで手早くgifアニメーション画像を作れないものだろうか。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0