The first thing to understand is that a lsystem has its own orientation in 3D space, the symbols are
explaned in the Lparser.txt file.
We start with the symbols for left and right:
                    ^
                +   |   -
                    |
            -----------------
The arrow points at the "draw direction", to move left: use +, to move right: use -
An example: ( text after the "#" sign is ignored by the Lparser )



2     # recursion depth
25    # angle
50    # thickness as % of length
F     # draw a full length
@     # end of file mark



If you view the result of file 1 (I always mean: viewing with the Lviewer), you just see a red bar standing up
straigth as in this picture....
Now try the next file:



2
25
50
+F
@



Viewing the result shows the same red bar, but now tilted in an angle of 25 degrees. Watching the picture
you see that the object is tilted somewhat towards the screen, this is because the Lviewer shows the
object from behind (default). So "+F" in this case means "turn left by the angle and draw a full length", "-F"
would mean "turn right by the angle and draw a full length". Remember we defined the angle to be 25
degrees. Try the file with different angle and thickness settings, so you get used to it.
Now the recursion depth: recursion is a loop, the file loops in itself as many times as defined.
An example:



4
25
50
A # the axiom
A = +FA
@



This file will loop 4 times, lets do that without the Lparser, just on paper:
loop 1: +F       gives A = +F
loop 2: +F+F     gives A = +F+F
loop 3: +F+F+F   gives A = +F+F+F
loop 4: +F+F+F+F gives A = +F+F+F+F
In every loop the A gets an "+F" added because we defined A to become +FA. Try to imagine what object
this file should generate. First an angle of 25 deg, followed by a full length, again an angle change of 25
deg and again a full length and so forth. If you repeate this long enough it should become a cirkel. Try the
file with the Lviewer..you'll see an open ended circle.
We also have the "-" option to try out, so:



4
25
50
AB
A = +FA
B = -FB
@



Reading this file tells us (as final string): +F+F+F+F-F-F-F-F (which is equal to AB). Again: try to imagine
what this object would look like, than try it with the Lviewer.
As you probably noticed the Lparser draws every next F ON the previous one, this is because we just
typed "AB"; so B follows A. We can alter the definition in such a way that this will not happen, we use the
"[ ]" symbols for this. Everything between the "[ ]" symbols is drawn but not counted for.. i.e. the Lparser
draws but does not remember where it left off between the brackets, it remembers only where it left off
before the brackets.
A file to explain this:



4
25
50
[A][B]
A = +FA
B = +FB
@



The final string will be: [+F+F+F+F][-F-F-F-F] So the Lparser starts at the bottom, draws the fist string [A],
than again starting from the bottom it draws the second string [B]. We can make this as complex as we
want, but do not randomly try things in the files without knowing what you are doing, its fun OK, but you will
learn little from it.
"+" and "-" is left and right (around up vector:), but there are more orientation commands, try this:



4
25
50
[A]c[B]c[C]c[D]
A=+FA
B=-FB
C=^FC
D=&FD
@



The final string will be: [+F+F+F+F][-F-F-F-F][^F^F^F^F][&F&F&F&F]. The Lparser.txt teaches us that "^"
and "&" are pitching up and down around the left vector. So this should be left and right on the 3D axis in
the space around the object. Also "c" is added in the final definition, this is the color command, every time
it is used the color changes. By editing them out one by one it becomes clear which definition becomes
what object in the drawing.
View the file, and try deeper recursions. What happens if the recursion gets above 14 ? What happens if
the "c" command is in between the brackets instead outside them? Why?
Notice that +F in these files means "left 25 degrees, draw F", it can also be defined as +(25)F. That way
you can use angles different from the predefined angle.
"E" (after the lparser has gone through all the loops!) can be inserted into the the form itself, imagine what
that would do: placing the form on each of its own branches!
try this file:



8
25
50
E
E = [A][B][C][D]
A = c+FAE
B = c-FBE
C = c^FCE
D = c&FDE
@



As you can see: "E" is inserted onto every branch. This is a fractal form, i.e. a form forever repeating itself
in itself. There are some differences, we pre-defined the first form, but hey... the same thing goes for the
famous snowflake fractal! Lets do that Snowflake as well! By now you will know what is done in the first
steps creating a .ls file setup:
Lets do this by the book: "The construction of the Koch curve proceeds in stages. In each stage the
number of segments increases by a factor of four." The initiator (the smallest form of the fractal) is "F"
of course, the generator (the smallest fractal part still having the form of the fractal) is a line like: _/\_
The angles are clearly 45 degrees, so the generator should be defined as:



4   # no need for deep recursion yet.
45  # the angle of 45 degrees.
50  # well... 50 is a good thickness.
A   # the axiom (for now).
A = ++F-F++F-F--
@



So, that was simple, now it is getting a bit more complex: We just made the generator, this is the form that
must be repeated in itself, keeping the same form. Now this generator is used to create the same form
again:



4
45
50
B
A = ++F-F++F-F--
B = A-A++A-A
@



As you see, the generator is used to create the same form as the generator itself, the beginning of the
snowflake fractal is made. We could get carried away and define C D E (not F!) G etc. every time
including the growing form....
 like:




4
45
50
D
A = ++F-F++F-F--
B = A-A++A-A
C = B-B++B-B
D = C-C++C-C
@



If you view this file the snowflake KOCH fractal is there! And without recursion, we defined every bit of the
form. That is not the way. Assume you want it to be repeated 100 times...some typing to do!, not even
speaking of the symbols you have to use to define them all, the alfabet (with use of upper and lower
case letters) is to short to define al the forms!
So we have to use recursion depth, like this:



4
45
50
C
A = ++F-F++F-F--
B = A-A++A-AC
C = cB-B++B-B
@



As you read the file, you will see that the "C" form is included into the "B" form, which itself is part of the
"C" form, etc. etc. Now we can use recursion depth! Try it, but keep the level below 12 :-)
Every new "C" form has a new color, defined with the c at the beginning of the C definition.
Maybe it is a good idea to make another fractal-like object. It's a simple one, called the Pythagoras tree. It
starts with the mean branch, then on it, under an angle of 45 degrees, two branches with a length of
1/SQR(2) times the mean branch. On them again two branches under 45 degrees with a length of
1/SQR(2) times the PREVIOUS length and so on, all in the same plane... Starting from the base form (F)
and working our
way up:


5
45
10
F
@




This is the mean branch, now we have to make the two branches on it, with a length of 1/SQR(2) the mean
branch, we use the command '(0.7071) for it.
Using this the file should look like this:





5
45
10
A
A = F[+'(0.7071)F][-'(0.7071)F]
@




As you see, I used the branching commands [ ] to do the job. Now the only thing that remains is: get it
recursive! Calculating the lengths is a rule like 0.7071*0.7071*0.7071.....etc, each recursion the length is
decreased by the same factor, this is the first thing that could be made recursive.
Doing just that, we get:



5
45
10
A
A = F[+BF][-BF]
B = '(0.7071)
@



B is now incorporated into A, but.... viewing the output shows an object with only two branches. We still
have to get the branching recursive. This is done by incorporating the form into itself.
Like:



5
45
10
A
A=[+BFA][-BFA]
B='(0.7071)
@



Try this at recursion level 10, looks nice does it! But it is still all in one plane, and the Lparser program is
much to powerfull to let it stay that way! If we add branching in the other two directions as well, maybe that
will do the trick:
Like:



5
45
10
A
A = [+cBFA][-cBFA][^cBFA][&cBFA]
B = '(0.7071)
@



Viewing the output shows a 3D tree, but the BASIC form of the fractal is lost. Clearly this is not the way, to
get a good 3D model one should make a so called rotation model of the fractal, i.e. turning it 90 degrees (
in this case!) on its central axis, continuously writing the 2D model, just like rotation models with
mathematical integration. The next file shows the form into four directions. As you can see, I coded the
form twice (definitions A and B), enclosed them within " [ ] ", the startingpoint does not alter, and put
them together just by adding them to each other in the AB command.



9
45
10
AB
A = [F[+FCA][-FCA]]
B = [F[^FCB][&FCB]]
C = '(0.7071)
@





Also possible :)
#--------L-System--C.J.van der Mark-----
#--------Pythagoras semi 3D form--------
5
5
10
Y
Y = X>X
X = A>B>A>B>A>B>A>B>A>B>A>B>A>B>A>B>A>B
A = [F[+(45)FCA][-(45)FCA]]
B = [F[^(45)FCB][&(45)FCB]]
C = '(0.7071)
@




Have fun!


Return to the homepage