#
# R
# Curva de Koch
#
# 2026 Março Ter,31 — Abril Ter, 7
# by
# j
# 

trig <- function(x0,y0,x1,y1,prt) {

    xA <- x0 + (1/3)*(x1 - x0)
    yA <- y0 + (1/3)*(y1 - y0)

    xm <- (1/2)*(x0 + x1)
    ym <- (1/2)*(y0 + y1)

    xB <- x0 + (2/3)*(x1 - x0)
    yB <- y0 + (2/3)*(y1 - y0)

    d <- (1/3)*sqrt ((x0 - x1)^2 + (y0 - y1)^2)
    
    m <- (y1 - y0)/(x1 - x0)

    if (m != 0) {
        
        mm = (-1/m)
        at = atan(mm)
        
    }
    else {
        
        mm = 1
        at = pi/2
        
    }
    
    dx = d*(sqrt(3)/2)*cos(at)
    dy = d*(sqrt(3)/2)*sin(at)

    if (mm > 0) {

        if (x1>x0) {
            
            xf <- xm + dx
            yf <- ym + dy
            
        }
        else {

            xf <- xm - dx
            yf <- ym - dy

        }
        
    }
    else {

        if (x1 > x0) {
            
            xf = xm - dx
            yf = ym - dy

        }
        else {
            
            xf = xm + dx
            yf = ym + dy
            
        }

    }

    if ( prt == 1 ) {
        
        cat('x0        =',x0,'\n')
        cat('y0        =',y0,'\n')
        cat('x1        =',x1,'\n')
        cat('y1        =',y1,'\n')
        cat('xA        =',xA,'\n')
        cat('yA        =',yA,'\n')
        cat('xm        =',xm,'\n')
        cat('ym        =',ym,'\n')
        cat('xB        =',xB,'\n')
        cat('yB        =',yB,'\n')
        cat('distância =',d,'\n')
        cat('m         =',m,'\n')
        cat('mm        =',mm,'\n')
        cat('ângulo    =',at,'\n')
        cat('xf        =',xf,'\n')
        cat('yf        =',yf,'\n')
        cat('----------------------','\n')
        
    }

    nupla <- list(xA,yA,xf,yf,xB,yB)

    return(nupla)
    
}

koch <- function(menu,max) {

    px <- c()
    py <- c()

    bakpx <- c()
    bakpy <- c()

    switch(menu,

       "1" = {

              x0 <- -5
              y0 <- 0

              x1 <- +5
              y1 <- 0

              px <- c(px,x0)
              py <- c(py,y0)

              px <- c(px,x1)
              py <- c(py,y1)

             },

       "2" = {
           
              x0 <- -5
              y0 <- 0

              xm <- 0
              ym <- 8.66

              x1 <- +5
              y1 <- 0

              x2 <- -5
              y2 <- 0

              px <- c(px,x0)
              py <- c(py,y0)

              px <- c(px,xm)
              py <- c(py,ym)

              px <- c(px,x1)
              py <- c(py,y1)

              px <- c(px,x2)
              py <- c(py,y2)
           
           }

    )

    for (i in 1:max) {
        
        rm(bakpx)
        rm(bakpy)
        
        bakpx <- c()
        bakpy <- c()

        cat('*** L =',length(px),'\n')
        
        for (j in 1:length(px) ) {
            
            bakpx <- c(bakpx,px[j])
            bakpy <- c(bakpy,py[j])
        
        }
        
        rm(px)
        rm(py)
        
        px <- c()
        py <- c()

        for (k in 1:(length(bakpx)-1)) {

            # cat('*** k =',k,'\n')

            rec <- trig(bakpx[k],bakpy[k],bakpx[k+1],bakpy[k+1],0)

            d1 <- bakpx[k]
            d2 <- rec[[1]]
            d3 <- rec[[3]]
            d4 <- rec[[5]]
            d5 <- bakpx[k+1]

            # cat('$$$ ',d1,d2,d3,d4,d5,'\n')

            if (k == 1) {
                
                px <- c(px,bakpx[k])
                py <- c(py,bakpy[k])

            }
            
            px <- c(px,rec[[1]])
            py <- c(py,rec[[2]])

            px <- c(px,rec[[3]])
            py <- c(py,rec[[4]])

            px <- c(px,rec[[5]])
            py <- c(py,rec[[6]])

            px <- c(px,bakpx[k+1])
            py <- c(py,bakpy[k+1])

        }

    }

    # plot(px,py,asp = 1,pch=19,cex=0.1)
    # segments(x0 = x0,y0=y0,x1=x1,y1=y1)

    plot(px,py,asp = 1,pch=19,cex=0.1)

    for (j in 1:(length(px)-1)) {
        # cat(j,px[j],'\n')
        segments(x0 = px[j],y0=py[j],x1=px[j+1],y1=py[j+1])
    }

}

koch("2",6)

Embed on website

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