#
# R
# Fractal da Árvore
#
# arvore(ff,class,d,x0,y0)
#
# ff . 0 = plot, 1 = no plot
# classe . 0 = simétrico, 1 = assimetrico
# d . Tamanho ramo
# x0 . x origem
# y0 . y origem
#
# 2026 Abril Qui, 9 — Qua, 15
# by
# j
#
ramos <- function(n,d0,ang,x0,y0) {
fat <- trunc(log(n)/log(2))
teta <- ang*pi/180
AG <- 18
d <- d0/(fat+1)
xS <- + d*cos(AG*pi/180)
yA <- - d*sin(AG*pi/180)
yB <- + d*sin(AG*pi/180)
dx1 <- xS*cos(teta) - yA*sin(teta)
dy1 <- xS*sin(teta) + yA*cos(teta)
dx2 <- xS*cos(teta) - yB*sin(teta)
dy2 <- xS*sin(teta) + yB*cos(teta)
x1 <- x0 + dx1
y1 <- y0 + dy1
x2 <- x0 + dx2
y2 <- y0 + dy2
nupla <- list(x0,y0,x1,y1,x2,y2)
# cat('n =',n,'\n')
# cat('idx =',idx,'\n')
# cat('ang =',ang,'\n')
# cat('fat = ',fat,'\n')
# cat('x0 =',x0,'\n')
# cat('y0 =',y0,'\n')
# cat('dx =',dx,'\n')
# cat('dy =',dy,'\n')
# cat('x1 =',x1,'\n')
# cat('y1 =',y1,'\n')
# cat('x2 =',x2,'\n')
# cat('y2 =',y2,'\n')
# cat('-------------','\n')
return(nupla)
}
arvore <- function(ff,classe,d,xstart,ystart) {
#
# Inicialização
#
max <- 10
n <- 1
p0x <- c()
p0y <- c()
px <- c()
py <- c()
bakpx0 <- c()
bakpy0 <- c()
bakpx <- c()
bakpy <- c()
#
# Criação do vetor de dados
#
x0 <- xstart
y0 <- ystart
p0x <- c(p0x,x0)
p0y <- c(p0y,y0)
px <- c(px,x0)
py <- c(py,y0)
#
# Inicialização Gráfica
#
if (ff == 0) {
alpha = as.character(max)
tit = paste("Arvore Fractal Assimetrica | nivel =",alpha)
plot(px,py,asp = 1,pch=19,cex=0.1,col="red",main = tit)
}
#
# Laço dos Níveis
#
for (M in 0:(max)) {
#
# Backup do vetor dados
#
rm(bakpx0)
rm(bakpy0)
rm(bakpx)
rm(bakpy)
bakpx0 <- c()
bakpy0 <- c()
bakpx <- c()
bakpy <- c()
# cat('*** Tamanho Dados =',length(px),'\n')
for (j in 1:length(px) ) {
# cat('@ BACKUP =',p0x[j],p0y[j],px[j],py[j],'\n')
bakpx0 <- c(bakpx0,p0x[j])
bakpy0 <- c(bakpy0,p0y[j])
bakpx <- c(bakpx,px[j])
bakpy <- c(bakpy,py[j])
}
rm(p0x)
rm(p0y)
rm(px)
rm(py)
p0x <- c()
p0y <- c()
px <- c()
py <- c()
j = 1
L <- 0
# cat('@@@ LAÇO @@@','\n')
while (j <= length(bakpx)) {
k <- 1
while ( (k <= 2^L) && (j <= length(bakpx)) ) {
#
# Cálculo Ângulo do Broto
#
x0 <- bakpx0[j]
y0 <- bakpy0[j]
x1 <- bakpx[j]
if (classe == 0) {
# SIMÉTRICO
y1 <- bakpy[j]
}
else {
# ASSIMÉTRICO
y1 <- bakpy[k]
}
if (x0 != x1) {
m <- (y1 - y0)/(x1 - x0)
ang <- abs(atan(m)*180/pi)
if ( x1 < x0 ) {
ang <- 180 - ang
}
}
else {
ang <- 90
}
#
# Cálculo dos Ramos
#
rec <- ramos(n,d,ang,bakpx[j],bakpy[j])
x0 <- rec[[1]]
y0 <- rec[[2]]
x1 <- rec[[3]]
y1 <- rec[[4]]
x2 <- rec[[5]]
y2 <- rec[[6]]
# cat('@ GERA =',x0,y0,x1,y1,x2,y2,'\n')
p0x <- c(p0x,x0)
p0y <- c(p0y,y0)
p0x <- c(p0x,x0)
p0y <- c(p0y,y0)
px <- c(px,x1)
py <- c(py,y1)
px <- c(px,x2)
py <- c(py,y2)
#
# Plota os Ramos
#
segments(x0 = x0,y0=y0,x1=x1,y1=y1,col="red")
segments(x0 = x0,y0=y0,x1=x2,y1=y2,col="red")
# cat('$$$ = ',L,j,n,'\n')
j <- j + 1
k <- k + 1
n <- n + 1
}
L <- L + 1
}
}
#
# Plota a base
#
segments(x0 = xstart, y0 = ystart, x1 = xstart, y1 = ystart-0.25,col="red")
segments(x0 = xstart-0.5, y0=ystart-0.25, x1=xstart+0.50, y1=ystart-0.25,pch=19,cex=2,col="red")
}
floresta <- function() {
max <- 2
j <- 0
ff <- 0
while ( j <= max ) {
x0 <- runif(1, min=0, max=10)
y0 <- runif(1, min=0, max=10)
sx <- runif(1, min=0, max=20)
sy <- runif(1, min=0, max=20)
if (sx < 10) {
x0 <- -1*x0
}
if (sy < 10) {
y0 - -1*y0
}
arvore(ff,0,0.25,0,0)
ff <- 1
j <- j + 1
}
}
arvore(0,1,0.25,0,0)
To embed this project on your website, copy the following code and paste it into your website's HTML: