- 昨日の続き
- 文字列の置換操作と、そこをカメが歩くことで絵を描いた
- 文字列の置換操作のR処理を昨日はベクトルを使ってやったけれど、ハッシュを使ってやることにする
library(hash)
MakeSequence2<-function(initX,Nstep,replacer){
X<-as.list(rep(c(0),Nstep+1))
x<-initX
X[[1]]<-x
for(i in 2:(Nstep+1)){
tmp<-c()
for(j in 1:length(x)){
tmp<-unlist(strsplit(paste(paste(tmp,sep="",collapse=""), replacer[[x[j]]],sep=""),""))
}
x<-tmp
X[[i]]<-x
}
X
}
ResultTurtle2<-function(x,d=1,D=pi/2,initX=NULL,initA=NULL){
Niter<-length(x)
X<-matrix(0,Niter+1,3)
Y<-X
L<-rep(0,Niter)
if(is.null(initX)){
initX<-c(0,0)
}
if(is.null(initA)){
initA<-0
}
X[1,]<-c(initX,initA)
Stocker<-c()
for(i in 1:length(x)){
X[i+1,]<-X[i,]
if(x[i]=="F"){
X[i+1,1]<-X[i+1,1]+d*cos(X[i,3])
X[i+1,2]<-X[i+1,2]+d*sin(X[i,3])
L[i]<-1
}else if(x[i]=="f"){
X[i+1,1]<-X[i+1,1]+d*cos(X[i,3])
X[i+1,2]<-X[i+1,2]+d*sin(X[i,3])
L[i]<-0
}else if(x[i]=="+"){
X[i+1,3]<-X[i+1,3]+D
L[i]<-0
}else if(x[i]=="-"){
X[i+1,3]<-X[i+1,3]-D
L[i]<-0
}else if(x[i]=="["){
Stocker<-c(Stocker,i+1)
}else if(x[i]=="]"){
X[i+1,]<-X[Stocker[length(Stocker)],]
L[i]<-0
Stocker<-Stocker[1:(length(Stocker)-1)]
}
Y[i,]<-X[i+1,]
}
list(X=X,Y=Y,L=L,x=x)
}
DrawTurtle2<-function(ttl,col=FALSE){
xlim<-ylim<-range(ttl$X[,1:2])
plot(ttl$X[,1],ttl$X[,2],cex=0.1,xlim=xlim,ylim=ylim)
for(i in 1:length(ttl$L)){
if(ttl$L[i]==1){
c<-1
if(col)c<-ttl$x[i]
segments(ttl$X[i,1],ttl$X[i,2],ttl$Y[i,1],ttl$Y[i,2],col=c)
}
}
}
elem<-c("F","[","]","+","-","X")
par(mfcol=c(3,2))
initX<-c("F")
replacer<-hash(elem,elem)
replacer[["F"]]<-"F[+F]F[-F]F"
Nstep<-5
X<-MakeSequence2(initX,Nstep,replacer)
X[[Nstep+1]]
D<-25.7/180*pi
ttl<-ResultTurtle2(X[[Nstep+1]],D=D)
DrawTurtle2(ttl)
initX<-c("F")
replacer<-hash(elem,elem)
replacer[["F"]]<-"F[+F]F[-F][F]"
Nstep<-5
X<-MakeSequence2(initX,Nstep,replacer)
X[[Nstep+1]]
D<-20/180*pi
ttl<-ResultTurtle2(X[[Nstep+1]],D=D)
DrawTurtle2(ttl)
initX<-c("F")
replacer<-hash(elem,elem)
replacer[["F"]]<-"FF-[-F+F+F]+[+F-F-F]"
Nstep<-4
X<-MakeSequence2(initX,Nstep,replacer)
X[[Nstep+1]]
D<-22.5/180*pi
ttl<-ResultTurtle2(X[[Nstep+1]],D=D)
DrawTurtle2(ttl)
initX<-c("X")
replacer<-hash(elem,elem)
replacer[["F"]]<-"FF"
replacer[["X"]]<-"F[+X]F[-X]+X"
Nstep<-7
X<-MakeSequence2(initX,Nstep,replacer)
X[[Nstep+1]]
D<-20/180*pi
ttl<-ResultTurtle2(X[[Nstep+1]],D=D)
DrawTurtle2(ttl)
initX<-c("X")
replacer<-hash(elem,elem)
replacer[["F"]]<-"FF"
replacer[["X"]]<-"F[+X][-X]FX"
Nstep<-7
X<-MakeSequence2(initX,Nstep,replacer)
X[[Nstep+1]]
D<-25.7/180*pi
ttl<-ResultTurtle2(X[[Nstep+1]],D=D)
DrawTurtle2(ttl)
initX<-c("X")
replacer<-hash(elem,elem)
replacer[["F"]]<-"FF"
replacer[["X"]]<-"F-[[X]+X]+F[+FX]-X"
Nstep<-5
X<-MakeSequence2(initX,Nstep,replacer)
X[[Nstep+1]]
D<-22.5/180*pi
ttl<-ResultTurtle2(X[[Nstep+1]],D=D)
DrawTurtle2(ttl)
par(mfcol=c(1,1))