#
# 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)
To embed this project on your website, copy the following code and paste it into your website's HTML: