Level 3 menger sponge in {rgl}
library(rgl)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# The base cube
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sl <- shapelist3d(cube3d(alpha = 1, color = 'grey90', specular = 'black', lit = TRUE), plot = FALSE)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#' Given a shapelist, calculate the next level of the sponge
#' @param sl shapelist3d() object
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
create_next_level <- function(sl, level) {
scale <- 1/2
sla <- scale3d(sl, scale, scale, scale)
x <- 1.5^(level-1)
shapelist3d(
list(
translate3d(sla, -x, -x, -x),
translate3d(sla, 0, -x, -x),
translate3d(sla, x, -x, -x),
translate3d(sla, -x, 0, -x),
translate3d(sla, x, 0, -x),
translate3d(sla, -x, x, -x),
translate3d(sla, 0, x, -x),
translate3d(sla, x, x, -x),
translate3d(sla, -x, -x, 0),
translate3d(sla, x, -x, 0),
translate3d(sla, -x, x, 0),
translate3d(sla, x, x, 0),
translate3d(sla, -x, -x, x),
translate3d(sla, 0, -x, x),
translate3d(sla, x, -x, x),
translate3d(sla, -x, 0, x),
translate3d(sla, x, 0, x),
translate3d(sla, -x, x, x),
translate3d(sla, 0, x, x),
translate3d(sla, x, x, x)
),
plot = FALSE
)
}
rgl::clear3d()
sl <- create_next_level(sl, level = 1)
sl <- create_next_level(sl, level = 2)
sl <- create_next_level(sl, level = 3)
shade3d(sl)