Generate and draw L-systems!
Check the accompanying blog post.
This program can be used to generate arbitrary L-systems. It supports:
- full rewriting rules
- full representation rules
- personalized angle and segment length for the representation
- push (‘[‘) and pop (‘]’) operations
LSystem data type
An L-system consists of:
- the L-system itself:
- an alphabet
- an axiom (i.e. the starting point)
- a set of rewriting rules (represented as a list of tuples)
- rules to transform it into a graphical representation:
- an angle and a length
- a set of representation rules (which symbols mean “draw forward”, “turn left”, “pop a position”, etc.)
JSON format for L-systems
L-systems can be specified using a straightforward JSON encoding. See
examples/ folder for examples.
Note that the
representation keys are associated to
arrays of arrays in JSON.
numbers. Everything else should be a string.
Building and running
You will need Stack.
From the repository, run:
stack build stack exec lsystems-exe -- examples/penroseP3.json
This will open a window, where you can move around using the mouse and zoom by scrolling.
For tests and documentation, run:
stack test --haddock
You can choose the L-system and the number of iteration via
command-line arguments, see the output of
lsystems -- Generate L-systems Usage: lsystems-exe FILENAME [-n|--iterations N] [-c|--color R,G,B] [-w|--white-background] Generate and draw an L-system Available options: FILENAME JSON file specifying an L-system -n,--iterations N Number of iterations (default: 5) -c,--color R,G,B Foreground color RGBA (0-255) (default: RGBA 1.0 1.0 1.0 1.0) -w,--white-background Use a white background -h,--help Show this help text
Examples are provided in the
- Lévy C curve
- Koch snowflake and Koch curve
- Sierpinski triangle and Sierpinski arrow curve
- Dragon curve
- Binary tree and fractal plant
The program is implemented in Haskell, using Gloss to display the generated L-systems.