Edge rewriting

  • エッジ(辺)を複雑な折れ曲がり曲線(辺の連結)に置き換えるルールによる図形描図ルール
  • ドラゴン曲線、シェルピンスキ バスケット
  • Figure 1.10

http://www.statgenet.med.kyoto-u.ac.jp/StatGenet/Prusinkiewicz/F1-10.jpeg

############
# Edge rewriting
# Figure 1.10
# 変化ルール
#d<-sample(1:4,1) # 移動距離

d<-1

# 動き配列
# 動きが5パターン
# (F,f,+,-) -> (Fr,Fl,f,+,-)

replacer<-as.list(rep(c(0),5))
replacer[[1]]<-c(1)
replacer[[2]]<-c(2)
replacer[[3]]<-c(3)
replacer[[4]]<-c(4)
replacer[[5]]<-c(5)

# Figure 1.10
par(mfcol=c(1,2))
########## a
# w= c(1)
# p1: 1->c(1,4,2,4)
# p2: 2->c(5,1,5,2)
D<-pi/2 # 角度変化

x<-c(1)

replacer[[1]]<-c(1,4,2,4)
replacer[[2]]<-c(5,1,5,2)

Niter<-10
X<-MakeSequence(x,Niter,replacer)


resTurtle<-ResultTurtle(X[[Niter+1]],d,D,ds=c(1,1,1,0,0),Ds=c(0,0,0,1,-1),Ls=c(1,1,0,1,1))
DrawTurtle(resTurtle)

########## b
# w= c(2)
# p1: 1->c(2,4,1,4,2)
# p2: 2->c(1,5,2,5,1)
D<-pi/3 # 角度変化

x<-c(2)

replacer[[1]]<-c(2,4,1,4,2)
replacer[[2]]<-c(1,5,2,5,1)

Niter<-6
X<-MakeSequence(x,Niter,replacer)


resTurtle<-ResultTurtle(X[[Niter+1]],d,D,ds=c(1,1,1,0,0),Ds=c(0,0,0,1,-1),Ls=c(1,1,0,1,1))
DrawTurtle(resTurtle)

par(mfcol=c(1,1))
  • さらなる例
    • hexagonal Gosper curveとquadratic Gosper curve

http://www.statgenet.med.kyoto-u.ac.jp/StatGenet/Prusinkiewicz/F1-11.jpeg

# Figure 1.11
par(mfcol=c(1,2))
########## a
# w= c(1)
# p1: 1->c(1,4,2,4,4,2,5,1,5,5,1,1,5,2,4)
# p2: 2->c(5,1,4,2,2,4,4,2,4,1,5,5,1,5,2)
D<-pi/3 # 角度変化

x<-c(1)

replacer[[1]]<-c(1,4,2,4,4,2,5,1,5,5,1,1,5,2,4)
replacer[[2]]<-c(5,1,4,2,2,4,4,2,4,1,5,5,1,5,2)

Niter<-4
X<-MakeSequence(x,Niter,replacer)


resTurtle<-ResultTurtle(X[[Niter+1]],d,D,ds=c(1,1,1,0,0),Ds=c(0,0,0,1,-1),Ls=c(1,1,0,1,1))
DrawTurtle(resTurtle)

########## b
# w= c(5,2)
# p1: 1->c(2,4,1,4,2)
# p2: 2->c(1,5,2,5,1)
D<-pi/2 # 角度変化

x<-c(5,2)

replacer[[1]]<-c(1,1,5,2,5,2,4,1,4,1,5,2,5,2,1,4,2,4,1,1,2,5,1,4,2,4,1,1,4,2,5,1,2,5,2,5,1,4,1,4,2,2,5)
replacer[[2]]<-c(4,1,1,5,2,5,2,4,1,4,1,2,4,1,5,2,2,5,1,5,2,4,1,2,2,5,1,5,2,1,4,1,4,2,5,2,5,1,4,1,4,2,2)

Niter<-2
X<-MakeSequence(x,Niter,replacer)


resTurtle<-ResultTurtle(X[[Niter+1]],d,D,ds=c(1,1,1,0,0),Ds=c(0,0,0,1,-1),Ls=c(1,1,0,1,1))
DrawTurtle(resTurtle)

par(mfcol=c(1,1))
  • 辺の色を塗り分ける

http://www.statgenet.med.kyoto-u.ac.jp/StatGenet/Prusinkiewicz/F1-12.jpeg

# Figure 1.12
par(mfcol=c(1,2))
########## a
# w= c(1)
# p1: 1->c(1,4,2,4,4,2,5,1,5,5,1,1,5,2,4)
# p2: 2->c(5,1,4,2,2,4,4,2,4,1,5,5,1,5,2)
D<-pi/3 # 角度変化

x<-c(1)

replacer[[1]]<-c(1,4,2,4,4,2,5,1,5,5,1,1,5,2,4)
replacer[[2]]<-c(5,1,4,2,2,4,4,2,4,1,5,5,1,5,2)

Niter<-4
X<-MakeSequence(x,Niter,replacer)


resTurtle<-ResultTurtle(X[[Niter+1]],d,D,ds=c(1,1,1,0,0),Ds=c(0,0,0,1,-1),Ls=c(1,1,0,1,1))
DrawTurtle(resTurtle,col=TRUE)

########## b
# w= c(5,2)
# p1: 1->c(2,4,1,4,2)
# p2: 2->c(1,5,2,5,1)
D<-pi/2 # 角度変化

x<-c(5,2)

replacer[[1]]<-c(1,1,5,2,5,2,4,1,4,1,5,2,5,2,1,4,2,4,1,1,2,5,1,4,2,4,1,1,4,2,5,1,2,5,2,5,1,4,1,4,2,2,5)
replacer[[2]]<-c(4,1,1,5,2,5,2,4,1,4,1,2,4,1,5,2,2,5,1,5,2,4,1,2,2,5,1,5,2,1,4,1,4,2,5,2,5,1,4,1,4,2,2)

Niter<-2
X<-MakeSequence(x,Niter,replacer)


resTurtle<-ResultTurtle(X[[Niter+1]],d,D,ds=c(1,1,1,0,0),Ds=c(0,0,0,1,-1),Ls=c(1,1,0,1,1))
DrawTurtle(resTurtle,col=TRUE)

par(mfcol=c(1,1))