## The Beauty of Fractals - L-system in Houdini

##### This article demonstrates the use of L-system to create fractals from simple rewriting rules. I will describe fractals and Houdini L-systems in general as well as the implementation of a specific kind of fractal pattern in Houdini L-systems. Furthermore I will demonstrate what to take into consideration if you want to successfully create specific kinds of “closed” fractals, like the Koch-Snowflake, and how even simple rules can create complex outputs.

##### Fractals

#### What are fractals?

The term fractal is derived from the Latin words fractus, frangere and means broken/break up/shatter/crush. Fractals are described as a mathematical set which holds the following characteristics, defined originally by Benoît Mandelbrot in 1975:

• **self-similarity**

“When each piece of a shape is geometrically similar to the whole, both the shape and the cascade that generate it are called self-similar.” (Mandelbrot, in Prusinkiewicz and Lindenmayer 2004, p. v)

• **underivabiliy** at any point; no gradient allocatable

and/or

•** fractal dimension**; an object possesses fractal dimension if its Hausdorff-Besicovitch dimension is greater than its topological dimension. Fractals do therefore usually neither belong to 0 (points), 1 (lines), 2 (surfaces) nor 3 (volumes) dimensional objects. The dimension of a point set in finite space, defined by a simplified explanation of the Hausdorff-Besicovitch Dimension, can be described with the help of the amount of N boxes with linear size p (for lim p → 0) necessary to cover the point set. D (for dimension) holds the following relation:

and for R tending to 0:

Therefore the Koch snowflake would have a dimension of 1.261859…

while “space-filling” fractal curves such as the Hilbert (Fig. 01c) curve possess a dimension of 2 but still meet the characteristic of self-similarity and underivability.

Since fractals are underivable at any point and/or feature fractal dimension they can be infinitely magnified and would never consist of straight lines (like e.g. a circle) but due to recursion of always a self-similar pattern.

#### Types

Different kinds of fractals (generated or represented by different means) such as

•** fractional Brownian motion** (random movement of particles in liquid or gas, due as interaction to fast-moving atoms/molecules); can be used to create fractal surfaces (such as mountains), Fig. 02a)

•** recursive mathematical families of equations** (Mandelbrot set, Julia set; Mandelbrot: sampling complex numbers), Fig. 02b).

• **recursive transformations** (generator) applied to an initial shape (initiator) e.g. Koch snowflake, Sierpinski carpet, Sierpinski triangle, dragon curve, etc. (Fig. 01)

##### L-Systems (in Houdini)

#### What are L-Systems?

Aristid Lindenmayer introduced the so called Lindenmayer-systems (or L-systems) in 1968, conceptualised as a mathematical algorithm to simulate plant development/biological growth. The central concept of L-system is rewriting which means to “recursively replacing an initial state (the initiator/*premise*) with rewritten geometry (the generator/*rule*)” (Side Effects Documentation 2012). The rules are applied simultaneously (parallel-derivation grammar) in contrast to the well known Chomsky grammar, which applies sequential, one rule per step.

Left: initiator/premise (0), generator/rule (1), generations 2-4 of the Koch curve (angle 60°)

#### Types

• **context-free L-systems: **

**•**(deterministic context-free (0-context)*d0L systems***L-system**; simplest form of L-system; appropriate to describe fractals) (see right)**•**(extension of d0l-system for creating branches)*bracketed systems***•**(to add divergence using probabilities; for modeling more realistic and randomised and less uniform structures)*stochastic systems***•**(using conditions which determines whether or not a rule will be applied to the consisting string/premise)*parametric systems*

• **context sensitive systems** (the context affects the applicability and outcome of a the application of a rule; useful to simulate interactions between different parts of a plant).

#### Basic Formalism

Basic commands of the turtle graphics routine which is used to interpret the strings created with Houdini’s l-system.

**Turtle: moving and drawing:**

F(l) Move forward a step of length l, draw a line between the original and new position H(l) Move forward half a step of length l, draw a line between the original and new position f(l) Move forward a step of length l withouth drawing a line h(l) Move forward half a step of length l without drawing a line

**Orientation of the turtle in space:**

+(α) Turn right by angle α

– (α) Turn left by angle α

& (α) Pitch up by angle α

^(α) Pitch down by angle α

\ (α) Roll clockwise by angle α

/ (α) Roll counter-clockwise by angle α

| Turn by 180 degrees * Roll by 180 degrees

##### Fractals in L-Systems

#### Implementation

L-systems are highly appropriate to create fractals, as they are recursively replacing the existing ge-ometry with the production rules from generation to generation. However with respect to Mandel-brot’s definition of fractals (including fractal dimension), L-systems can not implement fractals, since the output of L-systems always consist of a finite number of primitives (lines or polygons), Fig. 06. If the term fractal is used in a broader sense it could be said that an advanced Koch snowflake “as being closer to a curve of dimension log 4/log 3 than to a curve of dimension 1. Thus, a finite curve can be considered an approximate rendering of an infinite fractal as long as the interesting properties of both are closely related” (Lindenmayer 2004, p.176).

Finiteness of Houdini l-system, Koch-snowflakes (zoom from left to right), 7 generations;

#### Scaling

L-systems do not adjust their step size as the production rules are applied. Each single part of the geometry possesses therefore scale 1 what let the whole object grow with each generation. Without limiting, the scaling in Houdini fractals would grow exponentially; e.g. the Koch snowflake would grow 3 each generation (n):

Generation n = 0: Scale s = 1 | n = 1: s = 3 | n = 2: s = 9 | n = 3: s = 27 | n = 4: s = 81

In order to preserve the scale of a fractal, no matter which generation it is in, the following command is to add:

premise: F(1)

rule: F(i)=F(i • scaling factor)

#### Application

• using d0L-systems (deterministic context-free L-systems) to create fractals

• simple, symmetric fractals; starting with a closed form (axiom), e.g. triangle, quad, pentagon and rewrite the segments with a single rule, two rules, and/or different angles in axiom and rules

• in order to keep the closed form of the fractal it is important that the rule is angle-invariant: that the direction of the “turtle” at the beginning and the end of a production rule has to be the same.

→** AID0L** (angle-invariant deterministic context-free L-system)

##### Conclusion

**The main achievement of this research is the successful implementation of closed fractals, using different rules and angles, into Houdini L-systems. Fractals are by definition infinitely self-similar what makes them differ from the fractals implemented in L-systems. However, they are classified as being closer to a fractal as to a straight line or plane.**

** The most important aspect to successfully create closed fractals is a closed form as premise and an angle-invariant rule.**

##### Examples

Zoom into curve detail | Finiteness of Houdini L-System

Initiator/premise (F-F-F-F-F-F-F-F), generator/rule (F=F- – -F+F+F+F+F+F+F- – -F), generation 2; Angle:45

Zoom into curve detail | Finiteness of Houdini L-System

Initiator/premise (F++F++F), generator/rule (F=F+F- -F+F), generation 2; Angle: 60

1)

Generation: | 7 |

Angle: | 60 |

Premise: | F++F++F |

Rule 1: | F=F+F- -F+F |

2)

Generation: | 5 |

Angle: | 40 |

Premise: | F+F+F+F+F+F+F+F+F |

Rule 1: | F=F- – -F+F+F+F+F+F+F- – -F |

3)

Generation: | 5 |

Angle: | 45 |

Premise: | F+F+F+F+F+F+F+F |

Rule 1: | F=F- – -F+F+F+F+F+F+F- – -F |

4)

Generation: | 6 |

Angle: | 60 |

Premise: | F+F+F+F+F+F |

Rule 1: | F=F++F-F-F-F-F++F |

5)

Generation: | 6 |

Angle: | 60 |

Premise: | F+F+F+F+F+F |

Rule 1: | F=F-F+F+F+F-F |

6)

Generation: | 6 |

Angle: | 72 |

Premise: | F+F+F+F+F |

Rule 1: | F=F-F+F+F+F- -F |

7)

Generation: | 6 |

Angle: | 60 |

Premise: | F++F++F |

Rule 1: | F=F-(90)F+(90)F+(90)F-(90)F |

8)

Generation: | 6 |

Angle: | 90 |

Premise: | F+F+F+F |

Rule 1: | F=A-(60)A+(120)A-(60)A |

Rule 2: | A=F-F+F+F-F |

9)

Generation: | 6 |

Angle: | 60 |

Premise: | F- -F- -F |

Rule 1: | F=A+(-80)A+(45)A+A-(68)A+(45)A+(50)A+(45)A-(97)A |

Rule 2: | A=F-F++F-F |