Español   Ejemplos 3D: Sólidos fractales

La esponja de Menger

Otro ejemplo más de un sólido fractal, en este caso la esponja de Menger.

El argumento es el "grado de profundidad recursiva", tanto mayor cuanto más detalle queramos en el dibujo, pero teniendo en cuenta que cuanto mayor sea, más memoria consume. Por ejemplo, esponja 3 crea una esponja compuesta de 8000 cubitos, lo que implica que XLOGO debe disponer de hasta 256 Mb de memoria.

para esponja :p
  borrapantalla ocultatortuga
  perspectiva poncolorpapel 0
  haz "contador 0
  menger 800 :p
  tipea [ Numero de cubos: ] escribe :contador
  vistapoligono
fin

para cubo :l
  si :contador=10000
    [ vistapoligono ]
  haz "contador :contador+1
# color de las caras laterales
  hazlocal "colores [amarillo magenta cyan azul]
# caras laterales
  repite 4
    [ poncolorlapiz ejecuta elemento contador :colores
      cuadrado :l giraderecha 90
      avanza :l giraizquierda 90
      balanceaderecha 90 ]
# Base
  poncolorlapiz rojo cabeceaabajo 90
  cuadrado :l cabeceaarriba 90
  avanza :l cabeceaabajo 90
  poncolorlapiz verde
  cuadrado :l cabeceaarriba 90 retrocede :l
fin

para cuadrado :c
  empiezapoligono
    repite 4 [avanza :c giraderecha 90]
  finpoligono
fin

# esponja de Menger
# p: profundidad de la recursividad
# l: lado del cubo total
para menger :l :p
  si :p=0
   [ cubo :l ]
   [ hazlocal "p :p-1
     hazlocal "l :l/3
# cara anterior
     repite 3
       [ menger :l :p avanza :l ]
     retrocede 3*:l giraderecha 90
     avanza :l giraizquierda 90
     menger :l :p
     avanza 2*:l
     menger :l :p
     retrocede 2*:l giraderecha 90
     avanza :l giraizquierda 90
     repite 3
        [ menger :l :p avanza :l ]
     retrocede 3*:l
# Hacia la derecha
    cabeceaabajo 90 avanza :l cabeceaarriba 90
    menger :l :p
    avanza 2*:l
    menger :l :p
    retrocede 2*:l cabeceaabajo 90
    avanza :l cabeceaarriba 90
    repite 3
      [ menger :l :p avanza :l ]
    retrocede 3*:l giraizquierda 90
    avanza :l giraderecha 90
    menger :l :p
    avanza 2*:l
    menger :l :p
    retrocede 2*:l giraizquierda 90
    avanza :l giraderecha 90
    repite 3
      [menger :l :p avanza :l]
    retrocede 3*:l cabeceaabajo 90
    retrocede :l cabeceaarriba 90
    menger :l :p
    avanza 2*:l
    menger :l :p
    retrocede 2*:l cabeceaabajo 90
    retrocede :l cabeceaarriba 90 ]
fin
Probar este programa ahora

Comando a ejecutar:
esponja 2