|   |   | 
| (35 intermediate revisions by 2 users not shown) | 
| Line 1: | Line 1: | 
|  | ===Sierpinski curve=== |  | ===Online experiments with Lindenmayer Systems=== | 
|  |  | A Lindenmayer System consists of | 
|  |  | * an initial string called ''axiom'' | 
|  |  | * a set of rewriting ''rules'' | 
|  |  |   | 
|  |  | This is an experimental page, where the Lindenmayer Systems can be changed online. The visualization is done by the JavaScript library [http://jsxgraph.org JSXGraph]. | 
|  |  | For each system a maximum ''level'' is defined. If this value is increased, the complexity of the drawing rises and running time increases, too. | 
|  |  |   | 
|  |  | ===Examples=== | 
|  |  | Most of the examples are from the book by Przemyslaw Prusinkiewicz and James Hanan: ''Lindenmayer Systems, Fractals, and Plants'', see the References. | 
|  |  | ====First Example: Sierpinski curve==== | 
|  | <html> |  | <html> | 
|  | <link rel="stylesheet" type="text/css" href="http://jsxgraph.uni-bayreuth.de/distrib/jsxgraph.css" /> |  | <link rel="stylesheet" type="text/css" href="http://jsxgraph.uni-bayreuth.de/distrib/jsxgraph.css" /> | 
|  | <script type="text/javascript" src="http://jsxgraph.uni-bayreuth.de/distrib/prototype.js"></script>
 |  | 
|  | <script type="text/javascript" src="http://jsxgraph.uni-bayreuth.de/distrib/jsxgraphcore.js"></script> |  | <script type="text/javascript" src="http://jsxgraph.uni-bayreuth.de/distrib/jsxgraphcore.js"></script> | 
|  | <script type="text/javascript" src="http://jsxgraph.uni-bayreuth.de/distrib/jsxturtle.js"></script>
 |  | <form><textarea id="inputtext0" rows=15 cols=35 wrap="off" style="width:600px;"> | 
|  | <form><textarea id="inputtext0" rows=3 cols=35 wrap="off" style="width:600px;"> |  | 
|  | var level = 6; |  | var level = 6; | 
|  | var axiom = 'A'; |  | var axiom = 'A'; | 
| Line 29: | Line 37: | 
|  | <input type="button" value="clear" onClick="clearturtle(0)"> |  | <input type="button" value="clear" onClick="clearturtle(0)"> | 
|  | </form> |  | </form> | 
|  | <div id="box0"class="jxgbox"style="width:600px; height:600px;"></div> |  | </html> | 
|  | <script language="JavaScript">
 |  | <jsxgraph width="600" height="600" box="box0"> | 
|  | var t; |  | var t; | 
|  | var turtle = []; |  | var turtle = []; | 
|  | var brd = []; |  | var brd = []; | 
|  | brd[0] = JXG.JSXGraph.initBoard('box0', {originX: 300,originY: 300,unitX: 1,unitY: 1}); |  | brd[0] = JXG.JSXGraph.initBoard('box0', {boundingbox: [-300, 300, 300, -300]}); | 
|  | turtle[0] = new JSXTurtleObj(brd[0]); |  | turtle[0] = brd[0].create('turtle'); | 
|  | 
 |  | 
 | 
|  | function expander(level,axiom,rules) { |  | function expander(level,axiom,rules) { | 
| Line 46: | Line 54: | 
|  |          this.next = function() { |  |          this.next = function() { | 
|  |              if (this.pos>=this.code.length) return null; |  |              if (this.pos>=this.code.length) return null; | 
|  |              return this.code[this.pos++]; |  |              return this.code.charAt(this.pos++); | 
|  |          } |  |          } | 
|  |      }); |  |      }); | 
| Line 59: | Line 67: | 
|  |              this.code = this.rules[pattern]; |  |              this.code = this.rules[pattern]; | 
|  |          } |  |          } | 
|  |          return this.code[this.pos++]; |  |          return this.code.charAt(this.pos++); | 
|  |      } |  |      } | 
|  | } |  | } | 
| Line 98: | Line 106: | 
|  | function run(nr) { |  | function run(nr) { | 
|  |    brd[nr].suspendUpdate(); |  |    brd[nr].suspendUpdate(); | 
|  |    var code = $('inputtext'+nr).value; |  |    var code = document.getElementById('inputtext'+nr).value; | 
|  |    if (code=='') { return; } |  |    if (code=='') { return; } | 
|  |    t = turtle[nr]; |  |    t = turtle[nr]; | 
| Line 112: | Line 120: | 
|  |    turtle[nr].cs(); |  |    turtle[nr].cs(); | 
|  | } |  | } | 
|  | </script> |  | </jsxgraph> | 
|  | </html>
 |  | 
|  |   |  | 
|  |   |  | 
|  | ===Quadratic snowflake variation===
 |  | 
|  |   |  | 
|  | <html>
 |  | 
|  | <form><textarea id="inputtext1" rows=3 cols=35 wrap="off" style="width:600px;">
 |  | 
|  | var level = 5;
 |  | 
|  | var axiom = '+F';
 |  | 
|  | var rules = {
 |  | 
|  |     'F':'F-F+F+F-F', 
 |  | 
|  |     '+' : '+',
 |  | 
|  |     '-' : '-'
 |  | 
|  | };
 |  | 
|  | var symbols = { 'F':'F', 
 |  | 
|  |                 '+':'+',
 |  | 
|  |                 '-':'-',
 |  | 
|  |                 '[':'[',
 |  | 
|  |                 ']':']'
 |  | 
|  |               } ;
 |  | 
|  | var angle = 90;
 |  | 
|  | var len = 500/Math.pow(3,level);
 |  | 
|  | t.setPos(250,0);
 |  | 
|  | </textarea><br />
 |  | 
|  | <input type="button" value="run" onClick="run(1)">
 |  | 
|  | <input type="button" value="clear" onClick="clearturtle(1)">
 |  | 
|  | </form>
 |  | 
|  | <div id="box1" class="jxgbox" style="width:600px; height:600px;"></div>
 |  | 
|  | <script language="JavaScript">
 |  | 
|  | brd[1] = JXG.JSXGraph.initBoard('box1', {originX: 300, originY: 300, unitX: 1, unitY: 1});
 |  | 
|  | turtle[1] = new JSXTurtleObj(brd[1]);
 |  | 
|  | </script>
 |  | 
|  | </html>
 |  | 
|  |   |  | 
|  | ===Dragon curve===
 |  | 
|  |   |  | 
|  | <html>
 |  | 
|  | <form><textarea id="inputtext2" rows=3 cols=35 wrap="off" style="width:600px;">
 |  | 
|  | var level = 8;
 |  | 
|  | var axiom = 'Fl';
 |  | 
|  | var rules = {
 |  | 
|  |     'F' : 'F',
 |  | 
|  |     'l' : 'l+rF+', 
 |  | 
|  |     'r' : '-Fl-r', 
 |  | 
|  |     '+' : '+',
 |  | 
|  |     '-' : '-'
 |  | 
|  | };
 |  | 
|  | var symbols = { 'F':'F',
 |  | 
|  |                 'l':' ',
 |  | 
|  |                 'r':' ',
 |  | 
|  |                 '+':'+',
 |  | 
|  |                 '-':'-',
 |  | 
|  |                 '[':'[',
 |  | 
|  |                 ']':']'
 |  | 
|  |               } ;
 |  | 
|  |               
 |  | 
|  | var angle = 90;
 |  | 
|  | var len = 500/(level*level);
 |  | 
|  | </textarea><br />
 |  | 
|  | <input type="button" value="run" onClick="run(2)">
 |  | 
|  | <input type="button" value="clear" onClick="clearturtle(2)">
 |  | 
|  | </form>
 |  | 
|  | <div id="box2" class="jxgbox" style="width:600px; height:600px;"></div>
 |  | 
|  | <script language="JavaScript">
 |  | 
|  | brd[2] = JXG.JSXGraph.initBoard('box2', {originX: 300, originY: 300, unitX: 1, unitY: 1});
 |  | 
|  | turtle[2] = new JSXTurtleObj(brd[2]);
 |  | 
|  | </script>
 |  | 
|  | </html>
 |  | 
|  |   |  | 
|  | ===Islands and lakes===
 |  | 
|  |   |  | 
|  | <html>
 |  | 
|  | <form><textarea id="inputtext3" rows=3 cols=35 wrap="off" style="width:600px;">
 |  | 
|  | var level = 2;
 |  | 
|  | var axiom = 'F-F-F-F';
 |  | 
|  | var rules = {
 |  | 
|  |     'F' : 'F-f+FF-F-FF-Ff-FF+f-FF+F+FF+Ff+FFF',
 |  | 
|  |     'f' : 'ffffff', 
 |  | 
|  |     '+' : '+',
 |  | 
|  |     '-' : '-'
 |  | 
|  | };
 |  | 
|  | var symbols = { 'F':'F',
 |  | 
|  |                 'f':'f',
 |  | 
|  |                 '+':'+',
 |  | 
|  |                 '-':'-',
 |  | 
|  |                 '[':'[',
 |  | 
|  |                 ']':']'
 |  | 
|  |               } ;
 |  | 
|  |               
 |  | 
|  | var angle = 90;
 |  | 
|  | var len = 20/Math.pow(2,level);
 |  | 
|  | </textarea><br />
 |  | 
|  | <input type="button" value="run" onClick="run(3)">
 |  | 
|  | <input type="button" value="clear" onClick="clearturtle(3)">
 |  | 
|  | </form>
 |  | 
|  | <div id="box3" class="jxgbox" style="width:600px; height:600px;"></div>
 |  | 
|  | <script language="JavaScript">
 |  | 
|  | brd[3] = JXG.JSXGraph.initBoard('box3', {originX: 300, originY: 300, unitX: 1, unitY: 1});
 |  | 
|  | turtle[3] = new JSXTurtleObj(brd[3]);
 |  | 
|  | </script>
 |  | 
|  | </html>
 |  | 
|  |   |  | 
|  |   |  | 
|  | ===Peano curve===
 |  | 
|  |   |  | 
|  | <html>
 |  | 
|  | <form><textarea id="inputtext4" rows=3 cols=35 wrap="off" style="width:600px;">
 |  | 
|  | var level = 4;
 |  | 
|  | var axiom = 'X';
 |  | 
|  | var rules = {
 |  | 
|  |     'F' : 'F',
 |  | 
|  |     'X' : 'XFYFX+F+YFXFY-F-XFYFX', 
 |  | 
|  |     'Y' : 'YFXFY-F-XFYFX+F+YFXFY', 
 |  | 
|  |     '+' : '+',
 |  | 
|  |     '-' : '-'
 |  | 
|  | };
 |  | 
|  | var symbols = { 'F':'F',
 |  | 
|  |                 'X':' ',
 |  | 
|  |                 'Y':' ',
 |  | 
|  |                 '+':'+',
 |  | 
|  |                 '-':'-',
 |  | 
|  |                 '[':'[',
 |  | 
|  |                 ']':']'
 |  | 
|  |               } ;
 |  | 
|  |               
 |  | 
|  | var angle = 90;
 |  | 
|  | var len = 500/Math.pow(3,level);
 |  | 
|  | t.setPos(250,-250);
 |  | 
|  | </textarea><br />
 |  | 
|  | <input type="button" value="run" onClick="run(4)">
 |  | 
|  | <input type="button" value="clear" onClick="clearturtle(4)">
 |  | 
|  | </form>
 |  | 
|  | <div id="box4" class="jxgbox" style="width:600px; height:600px;"></div>
 |  | 
|  | <script language="JavaScript">
 |  | 
|  | brd[4] = JXG.JSXGraph.initBoard('box4', {originX: 300, originY: 300, unitX: 1, unitY: 1});
 |  | 
|  | turtle[4] = new JSXTurtleObj(brd[4]);
 |  | 
|  | </script>
 |  | 
|  | </html>
 |  | 
|  |   |  | 
|  | ===Hexagonal Gosper curve===
 |  | 
|  |   |  | 
|  | <html>
 |  | 
|  | <form><textarea id="inputtext5" rows=3 cols=35 wrap="off" style="width:600px;">
 |  | 
|  | var level = 3;
 |  | 
|  | var axiom = 'XF';
 |  | 
|  | var rules = {
 |  | 
|  |     'F' : 'F',
 |  | 
|  |     'X' : 'X+YF++YF-FX--FXFX-YF+', 
 |  | 
|  |     'Y' : '-FX+YFYF++YF+FX--FX-Y', 
 |  | 
|  |     '+' : '+',
 |  | 
|  |     '-' : '-'
 |  | 
|  | };
 |  | 
|  | var symbols = { 'F':'F',
 |  | 
|  |                 'X':' ',
 |  | 
|  |                 'Y':' ',
 |  | 
|  |                 '+':'+',
 |  | 
|  |                 '-':'-',
 |  | 
|  |                 '[':'[',
 |  | 
|  |                 ']':']'
 |  | 
|  |               } ;
 |  | 
|  |               
 |  | 
|  | var angle = 60;
 |  | 
|  | var len = 500/Math.pow(3,level);
 |  | 
|  | t.setPos(250,0);
 |  | 
|  | </textarea><br />
 |  | 
|  | <input type="button" value="run" onClick="run(5)">
 |  | 
|  | <input type="button" value="clear" onClick="clearturtle(5)">
 |  | 
|  | </form>
 |  | 
|  | <div id="box5" class="jxgbox" style="width:600px; height:600px;"></div>
 |  | 
|  | <script language="JavaScript">
 |  | 
|  | brd[5] = JXG.JSXGraph.initBoard('box5', {originX: 300, originY: 300, unitX: 1, unitY: 1});
 |  | 
|  | turtle[5] = new JSXTurtleObj(brd[5]);
 |  | 
|  | </script>
 |  | 
|  | </html>
 |  | 
|  |   |  | 
|  | ===Plant 1===
 |  | 
|  |   |  | 
|  | <html>
 |  | 
|  | <form><textarea id="inputtext6" rows=3 cols=35 wrap="off" style="width:600px;">
 |  | 
|  | var level = 3;
 |  | 
|  | var axiom = 'F';
 |  | 
|  | var rules = {
 |  | 
|  |     'F' : 'F[+F]F[-F]F',
 |  | 
|  |     '[' : '[',
 |  | 
|  |     ']' : ']',
 |  | 
|  |     '+' : '+',
 |  | 
|  |     '-' : '-'
 |  | 
|  | };
 |  | 
|  | var symbols = { 'F':'F',
 |  | 
|  |                 '+':'+',
 |  | 
|  |                 '-':'-',
 |  | 
|  |                 '[':'[',
 |  | 
|  |                 ']':']'
 |  | 
|  |               } ;
 |  | 
|  |               
 |  | 
|  | var angle = 25.7;
 |  | 
|  | var len = 500/Math.pow(3,level);
 |  | 
|  | t.setPos(0,-250);
 |  | 
|  | var shrink = 1.0;
 |  | 
|  | </textarea><br />
 |  | 
|  | <input type="button" value="run" onClick="run(6)">
 |  | 
|  | <input type="button" value="clear" onClick="clearturtle(6)">
 |  | 
|  | </form>
 |  | 
|  | <div id="box6" class="jxgbox" style="width:600px; height:600px;"></div>
 |  | 
|  | <script language="JavaScript">
 |  | 
|  | brd[6] = JXG.JSXGraph.initBoard('box6', {originX: 300, originY: 300, unitX: 1, unitY: 1});
 |  | 
|  | turtle[6] = new JSXTurtleObj(brd[6]);
 |  | 
|  | </script>
 |  | 
|  | </html>
 |  | 
|  |   |  | 
|  | ===Plant 2===
 |  | 
|  |   |  | 
|  | <html>
 |  | 
|  | <form><textarea id="inputtext7" rows=3 cols=35 wrap="off" style="width:600px;">
 |  | 
|  | var level = 4;
 |  | 
|  | var axiom = 'X';
 |  | 
|  | var rules = {
 |  | 
|  |     'F' : 'FF',
 |  | 
|  |     'X' : 'F-[[X]+X]+F[+FX]-X',
 |  | 
|  |     '[' : '[',
 |  | 
|  |     ']' : ']',
 |  | 
|  |     '+' : '+',
 |  | 
|  |     '-' : '-'
 |  | 
|  | };
 |  | 
|  | var symbols = { 'F':'F',
 |  | 
|  |                 'X':' ',
 |  | 
|  |                 '+':'+',
 |  | 
|  |                 '-':'-',
 |  | 
|  |                 '[':'[',
 |  | 
|  |                 ']':']'
 |  | 
|  |               } ;
 |  | 
|  |               
 |  | 
|  | var angle = 22.5;
 |  | 
|  | var len = 800/Math.pow(3,level);
 |  | 
|  | t.setPos(0,-250);
 |  | 
|  | </textarea><br />
 |  | 
|  | <input type="button" value="run" onClick="run(7)">
 |  | 
|  | <input type="button" value="clear" onClick="clearturtle(7)">
 |  | 
|  | </form>
 |  | 
|  | <div id="box7" class="jxgbox" style="width:600px; height:600px;"></div>
 |  | 
|  | <script language="JavaScript">
 |  | 
|  | brd[7] = JXG.JSXGraph.initBoard('box7', {originX: 300, originY: 300, unitX: 1, unitY: 1});
 |  | 
|  | turtle[7] = new JSXTurtleObj(brd[7]);
 |  | 
|  | </script>
 |  | 
|  | </html>
 |  | 
|  |   |  | 
|  | ===Hexagonal kolam===
 |  | 
|  |   |  | 
|  | <html>
 |  | 
|  | <form><textarea id="inputtext8" rows=3 cols=35 wrap="off" style="width:600px;">
 |  | 
|  | var level = 12;
 |  | 
|  | var axiom = 'X';
 |  | 
|  | var rules = {
 |  | 
|  |     'F' : 'F',
 |  | 
|  |     'X' : '[-F+F[Y]+F][+F-F[X]-F]',
 |  | 
|  |     'Y' : '[-F+F[Y]+F][+F-F-F]',
 |  | 
|  |     '[' : '[',
 |  | 
|  |     ']' : ']',
 |  | 
|  |     '+' : '+',
 |  | 
|  |     '-' : '-'
 |  | 
|  | };
 |  | 
|  | var symbols = { 'F':'F',
 |  | 
|  |                 'X':' ',
 |  | 
|  |                 'Y':' ',
 |  | 
|  |                 '+':'+',
 |  | 
|  |                 '-':'-',
 |  | 
|  |                 '[':'[',
 |  | 
|  |                 ']':']'
 |  | 
|  |               } ;
 |  | 
|  |               
 |  | 
|  | var angle = 60;
 |  | 
|  | var len = 100/(level);
 |  | 
|  | </textarea><br />
 |  | 
|  | <input type="button" value="run" onClick="run(8)">
 |  | 
|  | <input type="button" value="clear" onClick="clearturtle(8)">
 |  | 
|  | </form>
 |  | 
|  | <div id="box8" class="jxgbox" style="width:600px; height:600px;"></div>
 |  | 
|  | <script language="JavaScript">
 |  | 
|  | brd[8] = JXG.JSXGraph.initBoard('box8', {originX: 300, originY: 300, unitX: 1, unitY: 1});
 |  | 
|  | turtle[8] = new JSXTurtleObj(brd[8]);
 |  | 
|  | </script>
 |  | 
|  | </html>
 |  | 
|  |   |  | 
|  | ===Mango kolam===
 |  | 
|  |   |  | 
|  | <html>
 |  | 
|  | <form><textarea id="inputtext9" rows=3 cols=35 wrap="off" style="width:600px;">
 |  | 
|  | var level = 5;
 |  | 
|  | var axiom = 'A---A';
 |  | 
|  | var rules = {
 |  | 
|  |     'F' : 'F',
 |  | 
|  |     'f' : 'f',
 |  | 
|  |     'A' : 'f-F+Z+F-fA',
 |  | 
|  |     'Z' : 'F-FF-F--[--Z]F-FF-F--F-FF-F--',
 |  | 
|  |     '[' : '[',
 |  | 
|  |     ']' : ']',
 |  | 
|  |     '+' : '+',
 |  | 
|  |     '-' : '-'
 |  | 
|  | };
 |  | 
|  | var symbols = { 'F':'F',
 |  | 
|  |                 'f':'f',
 |  | 
|  |                 'A':' ',
 |  | 
|  |                 'Z':' ',
 |  | 
|  |                 '+':'+',
 |  | 
|  |                 '-':'-',
 |  | 
|  |                 '[':'[',
 |  | 
|  |                 ']':']'
 |  | 
|  |               } ;
 |  | 
|  |               
 |  | 
|  | var angle = 60;
 |  | 
|  | var len = 100/(level);
 |  | 
|  | </textarea><br />
 |  | 
|  | <input type="button" value="run" onClick="run(9)">
 |  | 
|  | <input type="button" value="clear" onClick="clearturtle(9)">
 |  | 
|  | </form>
 |  | 
|  | <div id="box9" class="jxgbox" style="width:600px; height:600px;"></div>
 |  | 
|  | <script language="JavaScript">
 |  | 
|  | brd[9] = JXG.JSXGraph.initBoard('box9', {originX: 300, originY: 300, unitX: 1, unitY: 1});
 |  | 
|  | turtle[9] = new JSXTurtleObj(brd[9]);
 |  | 
|  | </script>
 |  | 
|  | </html>
 |  | 
|  | 
 |  | 
 | 
|  |  | ====More examples==== | 
|  |  | * [[Quadratic snowflake variation]] | 
|  |  | * [[Dragon curve]] | 
|  |  | * [[Islands and lakes]] | 
|  |  | * [[Peano curve]] | 
|  |  | * [[Hexagonal Gosper curve]] | 
|  |  | * [[Plant generation I]] | 
|  |  | * [[Plant generation II]] | 
|  |  | * [[Hexagonal kolam]] | 
|  |  | * [[Mango kolam]] | 
|  |  | * [[Penrose tiling]] | 
|  | 
 |  | 
 | 
|  | ===Penrose tiling=== |  | ===The underlying JavaScript code=== | 
|  |   |  | The underlying [[JavaScript code for producing Lindenmayer systems]] | 
|  | <html>
 |  | 
|  | <form><textarea id="inputtext10" rows=3 cols=35 wrap="off" style="width:600px;">
 |  | 
|  | var level = 2;
 |  | 
|  | var Axiom = '[7]++[7]++[7]++[7]++[7]';
 |  | 
|  | var rules = {
 |  | 
|  |     '6' : '81++91----71[-81----61]++',
 |  | 
|  |     '7' : '+81--91[---61--71]+',
 |  | 
|  |     '8' : '-61++71[+++81++91]-',
 |  | 
|  |     '9' : '--81++++61[+91++++71]--71',
 |  | 
|  |     '1' : '',
 |  | 
|  |     '+' : '+',
 |  | 
|  |     '-' : '-',
 |  | 
|  |     '[' : '[',
 |  | 
|  |     ']' : ']'
 |  | 
|  |   };
 |  | 
|  | var symbols ={ 
 |  | 
|  |                 '1':'F',
 |  | 
|  |                 '6':' ',
 |  | 
|  |                 '7':' ',
 |  | 
|  |                 '8':' ',
 |  | 
|  |                 '9':' ',
 |  | 
|  |                 '+':'+',
 |  | 
|  |                 '-':'-',
 |  | 
|  |                 '[':'[',
 |  | 
|  |                 ']':']'
 |  | 
|  |                };
 |  | 
|  | var angle = 36.0;
 |  | 
|  | var len = 100/(level);
 |  | 
|  | </textarea><br />
 |  | 
|  | <input type="button" value="run" onClick="run(10)">
 |  | 
|  | <input type="button" value="clear" onClick="clearturtle(10)">
 |  | 
|  | </form>
 |  | 
|  | <div id="box10" class="jxgbox" style="width:600px; height:600px;"></div>
 |  | 
|  | <script language="JavaScript">
 |  | 
|  | brd[10]= JXG.JSXGraph.initBoard('box10', {originX: 300, originY: 300, unitX: 1, unitY: 1});
 |  | 
|  | turtle[10]= new JSXTurtleObj(brd[10]);
 |  | 
|  | </script>
 |  | 
|  | </html>
 |  | 
|  | 
 |  | 
 | 
|  |  | ===References=== | 
|  |  | * Przemyslaw Prusinkiewicz, James Hanan: Lindenmayer Systems, Fractals, and Plants (Lecture Notes in Biomathematics). Springer-Verlag 1989, ISBN 0-387-97092-4 | 
|  |  | * [http://en.wikipedia.org/wiki/L-system http://en.wikipedia.org/wiki/L-system] | 
|  |  | * [http://en.wikipedia.org/wiki/Space-filling_curve http://en.wikipedia.org/wiki/Space-filling_curve] | 
|  |  | * [http://www.biologie.uni-hamburg.de/b-online/e28_3/lsys.html An Introduction to Lindenmayer Systems] | 
|  | 
 |  | 
 | 
|  | 
 |  | 
 | 
|  | [[Category:Examples]] |  | [[Category:Examples]] | 
|  |  | [[Category:Fractals]] | 
|  | [[Category:Turtle Graphics]] |  | [[Category:Turtle Graphics]] | 
|  |  | [[Category:Lindenmayer systems]] |