Output
Grammar input
Commands input
levels | |
starting from X: Y: and at an initial angle of |
This is a plant/fractal generator that uses L-systems (L-system on Wikipedia)
Check out the new 3D version
How to use it:
First you need to write the production rules for your grammar (note that this application accepts only stocastic context-free grammars)
Below is a sample grammar:
-> Start
0.2 Number
0.4 Start + Start
0.3 Start - Start
0.1 ( Start )
-> Number
0.1 0
0.1 1
0.1 2
0.7 3
0.2 Number
0.4 Start + Start
0.3 Start - Start
0.1 ( Start )
-> Number
0.1 0
0.1 1
0.1 2
0.7 3
-> Start
//the first nonterminal symbol
//all nonterminal symbols are defined by -> Nonterminal
0.2 Number
0.4 Start + Start
0.3 Start - Start
0.1 ( Start )
//Start may rewrite itself as "Number", "Start + Start", "Start - Start" or "( Start )"
//thus we may have the following rewriting sequence: Start --> Start + Start --> Number + ( Start ) --> 3 + ( Start - Start )
//notice that EVERY nonterminal in a phrase MUST be rewritten
//notice that every line starts with a value - that value represents the chance of this rewriting rule to be chosen (their sum doesn't need to be 1 (the application normalizes these values))
-> Number
//here we tell the system to change that all its focus to the nonterminal "Number"
//and Number can be rewritten as 0, 1, 2, or 3 as these are the only known numbers in the universe
Turtle Graphics:
Now, if you want to draw preety plants and other stuff using this you need to know some Turtle Graphics (see Wikipedia)
It's simple, fun and powerful.
Imagine you're a pen on a piece of paper and you can walk Forward turn Left or Right.
You could walk straight ahead to draw a line. If you repeatedly walk 2 paces then slightly turn left you eventually come back to where you started, thus drawing a circle. Or you could follow a weird pattern of Forward, Left, Right commands and end up drawing fractal-like shapes.
A sequence of drawing commands can be generated using the above phrase generator.
Ex:
This is the grammar. It has only one nonterminal, namely "U". This goes in the "Grammar input" textarea
-> U
f r f l f l f r U
These are the turtle commands associated with symbols (place them in the "Commands" textarea)f r f l f l f r U
: f
forward 10
: r
rotate 90
: l
rotate -90
forward 10
: r
rotate 90
: l
rotate -90
forward 10 translates to "walk forward 10 units"
rotate 90 translates to "rotate clockwise 90 degrees"
rotate -90 translates to "rotate anticlockwise 90 degrees"
Complete list of Turtle Commands:
forward var/value | walk forward |
rotate var/value | rotate |
pen true/false | activate or deactivate drawing |
push | push the current state to the stack |
pop | pop a state from the stack |
color red green blue | sets the color to rgb(red,green,blue); red, green and blue take values between 0 and 255 |
width var/value | set the width of the pen |
text var/value | print the variable or value |
square var/value | draw a square |
var := other_var/value | assignement operation |
var += other_var/value | addition operation |
var -= other_var/value | subtraction operation |
var *= other_var/value | multiplication operation |
variables that start with a lower case leter are part of the current state
More examples:
Koch snowflake
-> S
1 A + A + A -> A 1 A - A + A - A
: A
forward 5 : + rotate 120 : - rotate -60 | |
Koch curve
-> F
1 F + F - F - F + F
: F
forward 10 : + rotate 90 : - rotate -90 | |
Sierpinski triangle
-> A
1 B - A - B -> B 1 A + B + A
: A
forward 10 : B forward 10 : + rotate 60 : - rotate -60 | |
Binary fractal tree
-> S
i F -> F f s [ - F ] [ + F ] u
i a:=100
s a*=0.707106781 u a*=1.41421356 f F:a + R:90 - R:-90 [ + ] - | |
Fractal plant
-> X
1 F - [ [ X ] + X ] + F [ + F X ] - X -> F 1 F F
: F
forward 10 : + rotate 25 : - rotate -25 : [ push : ] pop | |
Koch Curve
-> F
1 F - F + F + F F - F - F + F
: F
forward 5 : + rotate 90 : - rotate -90 | |
Thread plant
-> B
1 T B 1 P [ r B ] [ q B ] -> P 1 T P 1 T 1 T T 1 T T T -> T 1 f r f r f r f r 1 f q f q f q f q 1 f u f u f u f u 1 f t f t f t f t
: f
forward 7 : r rotate 10 : q rotate -10 : t rotate 13 : [ push : ] pop : u rotate -13 | |
Broccoli
-> S
1 i F -> F 1 f [ - F ] [ + F ]
: i
a := 100 w := 12 width w : f forward a : + rotate 45 : - rotate -60 : [ push a *= 0.707106781 w *= 0.7 width w : ] pop |
No comments:
Post a Comment