15.2 Turtle interpretation

This first example helps to understand what is a Lindenmayer system but we can’t see for now the rapport with our turtle and LOGO..

Here it comes interesting: every word we built before has no meaning. We’re going to define for each letter of the sequence an action to execute with the turtle, and draw with this method 2D or 3D drawing.

15.2.1 Usual Symbols

For example, if α = 90 with a unit step of 10 turtle steps, we have:










Symbol F + - & ^ \ |









XLOGO Command fd 10 lt 90 rt 90 down 90 up 90 lr 90 rr 90 rt 180









15.2.2 Van Snowflake

Let’s consider the L-system:

First iterations:

PIC

PIC

PIC
PIC

XLOGOProgram:

 
to snowflake :p  
globalmake "unit 300/power 3 :p-1  
repeat 3 [f :p-1 right 120]  
end  
 
to f :p  
if :p=0 [forward :unit stop]  
f :p-1 left 60 f :p-1 right 120 f :p-1 left 60  
f :p-1  
end  

15.2.3 Quadratic Van Koch curve

Given this new L-system:

Here are the first representations using α = 90, we adjust the unit step for the figure has a constant size.

PIC

PIC

PIC
PIC

Then it is very easy to create a Logo program to generate these drawings:

# p represent the order  
to koch :p  
# Between two iteration, the unit step is divided by  4  
# The final figure will have a maximal size of 600x600  
globalmake "unit 300/power 4 :p-1  
 
repeat 3 [f :p-1 left 90] f :p-1  
end  
 
# Rewriting rules  
to f :p  
if :p=0 [forward :unit stop]  
f :p-1 left 90 f :p-1 right 90 f :p-1 right 90  
f :p-1 f :p-1 left 90 f :p-1 left 90 f :p-1 right 90 f :p-1  
end

15.2.4 Dragon curve

to a :p  
if :p=0 [forward :unit stop]  
a :p-1 left 90 b :p-1 left 90  
end  
 
to b :p  
if :p=0 [forward :unit stop]  
right 90 a :p-1 right 90 b :p-1  
 
end  
 
to dragon :p  
globalmake "unit 300/8/ :p  
a :p  
end

PIC

dragon 10

PIC

dragon 15

15.2.5 Hilbert 3D curve

The following example will generate a 3D Hilbert curve. This curve is singular because it fills perfectlty a cube when we increase iterations.

Here is the L-system to consider:

to hilbert :p  
clearscreen 3d  
globalmake "unit 400/power 2 :p  
linestart setpenwidth :unit/2  
a :p  
lineend  
view3d  
end  
 
to a :p  
if :p=0 [stop]  
b :p-1 right 90 forward :unit left 90  c :p-1 forward :unit c :p-1  
left 90 forward :unit right 90 d :p-1 downpitch 90 forward :unit uppitch 90 d :p-1  
right 90 forward :unit left 90 downpitch 180 c :p-1 forward :unit c :p-1  
left 90 forward :unit left 90 b :p-1 rightroll 180  
end  
 
to b :p  
if :p=0 [stop]  
a :p-1 downpitch 90 forward :unit uppitch 90 c :p-1 forward :unit b :p-1 uppitch 90  
forward :unit uppitch 90 d :p-1 uppitch 180 right 90 forward :unit right 90 d :p-1  
uppitch 90 right 180 forward :unit uppitch 90 b :p-1 right 180 forward :unit c :p-1  
uppitch 90 forward :unit uppitch 90 a :p-1 rightroll 180  
end  
 
to c :p  
if :p=0 [stop]  
right 180 d :p-1 uppitch 90 right 180 forward :unit uppitch 90 b :p-1 right 90  
forward :unit left 90 c :p-1 uppitch 90 forward :unit uppitch 90 a :p-1 downpitch 180  
 forward :unit a :p-1 downpitch 90 forward :unit uppitch 90 c :p-1 left 90 forward :unit  
left 90 b :p-1 uppitch 90 forward :unit uppitch 90 d :p-1 rightroll 180  
end  
 
to d :p  
if :p=0 [stop]  
right 180 c :p-1 forward :unit b :p-1 right 90 forward :unit left 90 b :p-1 right 180  
forward :unit a :p-1 downpitch 90 forward :unit uppitch 90 a :p-1 downpitch 180 forward :unit  
b :p-1 right 90 forward :unit left 90 b :p-1 right 180 forward :unit c :p-1 rightroll 180  
end

And the first iterations:

PIC

PIC

PIC
PIC

Nice, isn’t it?