ぱらぱらめくる『The algorithmic beauty of plants』2 枝分かれ

  • 昨日の続き
  • 文字列の置換操作と、そこをカメが歩くことで絵を描いた
  • 文字列の置換操作のR処理を昨日はベクトルを使ってやったけれど、ハッシュを使ってやることにする

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

# やはり文字列で行こう
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))
############ a

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)

############ b

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)

############ c

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)

############ d

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)


############ e

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)

############ f

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))