LSystem lsystem;
void setup(){
size(500, 500);
lsystem = new LSystem();
}
void draw(){
println("step: " + frameCount);
lsystem.draw();
lsystem.step();
}
class LSystem{
float d;
float delta;
String string;
HashMap<Character, String> rules;
float iniDir;
PVector iniPos;
LSystem(){
d = 0.6;
delta = 90;
string = "-F";
rules = new HashMap<Character, String>();
rules.put('F', "F+F-F-F+F");
iniDir = -90;
iniPos = new PVector(-220, 100);
}
void step(){
String nextString = "";
for(int i = 0; i < string.length(); i++){
char c = string.charAt(i);
if(rules.containsKey(c)){
nextString += rules.get(c);
} else {
nextString += c;
}
}
string = nextString;
}
void draw(){
background(0);
stroke(255);
translate(width / 2, height / 2);
translate(iniPos.x, iniPos.y);
rotate(radians(iniDir));
for(int i = 0; i < string.length(); i++){
char c = string.charAt(i);
switch(c){
case 'F':
line(0, 0, d, 0);
translate(d, 0);
break;
case 'f':
translate(d, 0);
break;
case '+':
rotate(radians(-delta));
break;
case '-':
rotate(radians(delta));
break;
}
}
}
}