Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


Go package and executable that implements the Fractal Growth algorithm described in The Computational Beauty of Nature by Gary William Flake (MIT Press 2011). This algorithm generates self-similar fractals using a simple grammar-based approach called an L-System.

The L-System grammar consists of a starting point (the seed) and a set of expansion rules. The seed is used as the starting point and a sequence of symbols is generated by evaluating the grammar repeatedly over a fixed number of iterations. During each evaluation each symbol in the sequence is replaced with a new set of symbols using the grammar's rules.

The final sequence of symbols is converted into an image by a plotter which interprets the sequence as a list of movement commands for a simple turtle graphics system.

Build Status


Simply run

go get -u

Documentation is at


For full control, import the package into your program, define a Grammar and use a Plotter to draw it. This repository contains a sample application in growth.go that demonstrates how to control the generated image. If you ran the go get command above then the application will have been compiled into an executable present at $GOPATH/bin/growth

Run the executable to generate the default plot of the big-h fractal, which will be written to a file called growth.png. The particular fractal to draw can be specified with the -e command line flag. See catalog/catalog.go for a list of pre-defined fractals. Use the -o flag to change the output filename.



Image of tree-2 fractal


Image of bent-big-h fractal

Grammar Expansion

The sequence a string is initialised to the seed's value. On each iteration each rune in the string is matched against the rules defined in the grammar. A new sequence string is built by replacing the rune by the substitution defined in the rule, delimited by < and > which indicate that the plotter should step down in scale during this part of the sequence. If the rune does not match a rule then it is simply copied into the new sequence.

As an example, given the seed F++F++F and a rule F: F-F++F-F the following sequences would be generated on each iteration:

  1. F++F++F
  2. <F-F++F-F>++<F-F++F-F>++<F-F++F-F>
  3. <<F-F++F-F>-<F-F++F-F>++<F-F++F-F>-<F-F++F-F>>++<<F-F++F-F>-<F-F++F-F>++<F-F++F-F>-<F-F++F-F>>++<<F-F++F-F>-<F-F++F-F>++<F-F++F-F>-<F-F++F-F>>

Multiple rules can be specified. For example the sierpinksi-gasket example has a seed of F--F--F and two rules: F: F--F--F--GG and G: GG. These generate the following sequences:

  1. F--F--F
  2. <F--F--F--GG>--<F--F--F--GG>--<F--F--F--GG>
  3. <<F--F--F--GG>--<F--F--F--GG>--<F--F--F--GG>--<GG><GG>>--<<F--F--F--GG>--<F--F--F--GG>--<F--F--F--GG>--<GG><GG>>--<<F--F--F--GG>--<F--F--F--GG>--<F--F--F--GG>--<GG><GG>>

Plotting Symbols

The Plotter interprets the following symbols. All others symbols are ignored.

  • F - move forward by the current step size and draw a line from the previous position to the new one
  • G - move forward by the current step size without drawing a line
  • + - rotate clockwise by the plotter's configured angle
  • - - rotate anticlockwise by the plotter's configured angle
  • [ - save the current position and angle
  • ] - restore the previous position and angle
  • | - identical behaviour to F however it is usually not expanded in a grammar so can be used to preserve scale
  • < - reduce the step size and line width by multiplying by StepDelta and LineWidthDelta
  • '>' - restore the previous step size and line width


This is free and unencumbered software released into the public domain. For more information, see or the accompanying UNLICENSE file.


Go implementation of the Fractal Growth algorithm








No packages published