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

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: