对于作业,我们需要在R中画一棵圣诞树。 我在互联网上搜索过,发现了一些有用的建议,但最终,我不知道如何继续,希望有人能帮助我。
到目前为止,这是我的代码。
#ctree: prints a Christmas tree on screen with size N
ctree <- function(N){
for (i in 1:N){
width = sample("*",i,replace=T)
cat(width,sep="-","\n")
}
cat(width[1],"\n")
}
这让我看到了树的中间和右侧(N = 4),这很棒,但还不够。
*-
*-*-
*-*-*-
*-*-*-*-
*
我计划逆转我所拥有的(基本上右对齐函数的产品)来创建左侧,随后删除左侧最右边的列并将其与树的右侧粘合在一起,创建一个圣诞树。
我真的希望有人可以帮我实现这个目标!期待您的建议。
提前致谢。
答案 0 :(得分:3)
对于任何感兴趣的人:这就是我最后在R中创建圣诞树的过程。
#ctree: prints a Christmas tree on screen with amount of branch levels N
ctree <- function(N){
filler = "*"
blank = ""
for (i in 1:N){
row = c(sample(blank,N-i,replace=T),sample(filler,i,replace=T),sample(blank,N-i,replace=T))
cat(row,"\n")
}
cat(c(sample(blank,(N-1),replace=T),sample(filler,1,replace=T),sample(blank,(N-1),replace=T)),"\n")
} #ctree
这是结果!我自己快乐的小(或大,不管你的船漂浮)树。
答案 1 :(得分:1)
此代码来自其他人。我希望我能相信他们,但我已经失去了消息来源。它产生的树是美丽的,也许你可以为你的目的修改它。
part <- list(x0=0,y0=0,x1=0,y1=1,
branch1=NULL,branch2=NULL,extend=NULL,
lwd=1,depth=0,col='springgreen')
par(mfrow=c(1,1),mar=c(5, 4, 4, 2) + 0.1)
segplot <- function(tree) {
if (is.null(tree)) return()
segments(tree$x0,tree$y0,tree$x1,tree$y1,
col=tree$col,
lwd=tree$lwd)
segplot(tree$branch1)
segplot(tree$branch2)
segplot(tree$extend)
}
#segplot(part)
grow <- function(tree) {
if (is.null(tree) ) return(NULL)
tree$lwd=tree$lwd*1.2
if (tree$lwd>2.5) tree$col <- 'brown'
if (is.null(tree$extend)) {
tree$extend <- list(
x0=tree$x1,
y0=tree$y1,
x1=rnorm(1,1,.03)*(2*tree$x1-tree$x0),
y1=(rnorm(1,.98,.02)+.02*(tree$x1==tree$x0))*(2*tree$y1-tree$y0),
branch1=NULL,
branch2=NULL,
extend=NULL,
lwd=1,
depth=tree$depth,
col=tree$col
)
length=sqrt((tree$x1-tree$x0)^2 + (tree$y1-tree$y0)^2)
angle <- asin((tree$x1-tree$x0)/length)
branch <- list(
x0=(tree$x1+tree$x0)/2,
y0=(tree$y1+tree$y0)/2,
branch1=NULL,
branch2=NULL,
extend=NULL,
lwd=1,
depth=tree$depth,
col=tree$col
)
shift <- rnorm(2,.5,.1)
branch$x0 <- shift[1]*tree$x1+(1-shift[1])*tree$x0
branch$y0 <- shift[1]*tree$y1+(1-shift[1])*tree$y0
length=length*rnorm(1,.5,.05)
co <- runif(1,.35,.45)
branch$x1 <- branch$x0+sin(angle+co)*length
branch$y1 <- branch$y0+cos(angle+co)*length
tree$branch1 <- branch
branch$x0 <- shift[2]*tree$x1+(1-shift[2])*tree$x0
branch$y0 <- shift[2]*tree$y1+(1-shift[2])*tree$y0
co <- runif(1,.35,.45)
branch$x1 <- branch$x0+sin(angle-co)*length
branch$y1 <- branch$y0+cos(angle-co)*length
tree$branch2 <- branch
} else {
tree$branch1 <- grow(tree$branch1)
tree$branch2 <- grow(tree$branch2)
tree$extend <- grow(tree$extend)
}
tree$depth <- tree$depth+1
if (tree$depth>2) tree$col <- 'green'
if (tree$depth>4) tree$col <- 'darkgreen'
if (tree$depth>6) tree$col <- 'brown'
tree
}
tree <- part
for (i in 1:9) tree <- grow(tree)
par(mar=c(0,0,0,0))
plot(x=c(-3,3),y=c(0,9),type='n',axes=FALSE,xlab='',ylab='')
segplot(tree)
答案 2 :(得分:0)
这是一个更简洁的版本:
ctree <- function(N=10){
for (i in 1:N) cat(rep("",N-i+1),rep("*",i),"\n")
cat(rep("",N),"*\n")
}
ctree()