14.1 Using recursion

Let’s consider a Menger sponge of order n which side length is L.

pict

On the schema, we can see that this sponge contains 20 Menger sponges of order n− 1 and with a side length     L     --     3. The recursive structure of the sponge is well shown.



The program:

                                                                                                  
                                                                                                  
 to cube :l
 if :counter=10000 [view3d]
 # faces colors
 localmake "colors [yellow magenta cyan blue]
 # lateral faces
 repeat 4 [setpencolor run item repcount :colors square :l right 90 forward  :l left 90 rightroll 90]
 # bottom
 setpencolor red downpitch 90 square :l uppitch 90
 forward :l downpitch 90 setpencolor green square :l uppitch 90 back :l
 end
 
 to square :c
 globalmake "counter :counter+1
 polystart
 repeat 4 [forward :c right 90]
 polyend
 end
 
 # Menger’s sponge
 # p: recursion order
 # l: side length of the cube
 to menger :l :p
 if :p=0 [cube :l] [
   localmake "p :p-1
   localmake "l :l/3
   #front face
   repeat 3 [menger :l :p forward :l] back 3*:l
   right 90 forward :l left 90
   menger :l :p forward 2*:l menger :l :p back 2*:l
   right 90 forward :l left 90
   repeat 3 [menger :l :p forward :l] back 3*:l
   #right face
  downpitch 90 forward :l uppitch 90
   menger :l :p  forward 2*:l menger :l :p back 2*:l
   downpitch 90 forward :l uppitch 90
   repeat 3 [menger :l :p forward :l] back 3*:l
   left 90 forward :l right 90
   menger :l :p  forward 2*:l menger :l :p back 2*:l
   left 90 forward :l right 90
   repeat 3 [menger :l :p forward :l] back 3*:l
   downpitch 90 back :l uppitch 90
   menger :l :p  forward 2*:l menger :l :p back 2*:l
    downpitch 90 back :l uppitch 90
 ]
 end
 
 to sponge :p
 clearscreen hideturtle globalmake "counter 0 3d setscreencolor 0 menger 800 :p
 write [nombre penpaint polygone: ] print :counter
 view3d
 end

This program has four procedures: