Lindemayer boompjes

 afbeelding van de drie boompjes
 
 
 

boomje na een keer drukken op de g toets

 
boomje "a" na een keer drukken op de g toets
met de Console geopend
 
 
 
 

boomje na 2 keer drukken op de g toets

 
boompje "a" na twee keer drukken op de g toets 
 

F opetellen bij de startzin 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
 
   

drie Lindemayer boompjes.     terug naar de inleiding        naar de drie Lindemayer boomjes in fullscreen

De schets maakt gebruik van objecten van de class  "Text"  en de superclass "Vormen" (dit omdat "Text" een subclass is van "Vormen"0

Kenmerken van een L system

1) Alphabet waarin je aangeef welke karaters in het L system zijn toegestaan. Hier zij dit de vijf karakters F   [ +  ] en -
2) Axioma zijn de karakters waarmee je start hier is dat de F

3) De rules of regels voor boomje a   F --> F[+F]F[-F]F (is de startzin) . F wordt in 5 iteraties (regel 108) bij deze startzin opgeteld (regel 50)

Zo onstaat een lange zin (wordt in het console geprint zie regel 60), De karakters in deze zin worden in de functie Turtle (regel 63) omgezet in lijntjes
F is een lijn (regel 69) met lengte 2*n (regel  11). Met + en - wordt de lijn geroteerd (regel 90 voor boompje a).
De [ en ] tekens zorgen voor push en pop zodat alleen het betreffend lijntje de rotatie krijgt,
dit samen met translate (regel 70) waardoor het canvas weer in de oorspronkelijke positie komt
De functie wordt Turtle genoemd omdat er karakters worden omgezet in vormen die een bepaald gedrag vertonen, ook wel turtle graphics genoemd,
Turtle graphics is ook een methode waarmee kinderen leren progammeren in de programmeertaal python
 
 
let zin = "F"; let teller;
let len; let x; let y; let n; 
let regels = [];
let hoek;
 
function setup() {
  createCanvas (windowWidth, windowHeight);
  y = height/2; x = width/2;
  n = height/20;
  len = 2*n;
  teller = 0;
//  ruitjespap = new Ruitjes(n, x, y);
  text1 = new Text("toets g is de groeitoets",0.8*n,1,x-15*n,y-8*n,0,3,
  color(200,0,250,150),2,color(-0,255,255,150));
  text2 = new Text("toets a is boompje a", 0.8*n,1,x-15*n,y-7*n,0,3,
  color(200,0,250,150),2,color(-0,255,255,150));
  text3 = new Text("toets b is boompje b", 0.8*n,1,x-15*n,y-6*n,0,3,
  color(200,0,250,150),2,color(-0,255,255,150));
  text4 = new Text("toets c is boompje c", 0.8*n,1,x-15*n,y-5*n,0,3,
  color(200,0,250,150),2,color(-0,255,255,150));
  //De regels vastleggen in een array van dicts
  //voor het Lindemayer system wordt er maar een array cel gebruikt
  regels[0] = { a: "F", b: "F[+F]F[-F]F"} //a
  hoek = radians(25.7);
}
 
function draw() {
  background(230,251,255);
//  ruitjespap.show();
  text1.display();
  text2.display();
  text3.display();
  text4.display();
  stroke(0);
  turtle();
}
//de functie om de  Lindemayer zin op te bouwen
function linZin() {
  //in onderstaande code wordt bij de eerste stap Axioma F in volgende gestopt
  len *= 0.5;
  let volgendeZin = "";
  for (let i = 0; i < zin.length; i++) {
    let volgende = zin.charAt(i);
 
    let found = false;
    for (let j = 0; j < regels.length; j++) {
      if (volgende == regels[j].a){
        found = true;
        volgendeZin += regels[j].b;
        break;
    }
  }
     if (!found) {
      volgendeZin += volgende; //voor het geval  a: ""
   }
}
// de volgende zin wordt nu de oorspronkelijke zin dus
   zin = volgendeZin;
   console.log(zin);
}
 
function turtle() {
  translate(width/2, height);
  for (let i = 0; i < zin.length; i++) {
    let volgend = zin.charAt(i);
 
    if (volgend == "F") {
      line(0, 0, 0, -len);
      translate(0, -len); //door deze translate ga je naar het eindpunt van de lijn
    } else if (volgend == "+") {
      rotate(-hoek);
    } else if (volgend == "-") {
      rotate(hoek);
    } else if (volgend == "[") {
      push();
    } else if (volgend == "]") {
      pop();
    }
  }
}
 
function windowResized() {
  resizeCanvas(windowWidth, windowHeight);
}
 
function keyPressed() {
 if (key == 'a') {
    teller = 0;
    zin = "F"; len = 2*n; hoek = radians(25.7);
    regels[0] = { a: "F", b: "F[+F]F[-F]F"}   //a
    draw();
}
 if (key == 'b') {
    teller = 0;
    zin ="F"; len = 10*n; hoek = radians(20);
    regels[0] = { a: "F", b: "F[+F]F[-F][F]"}  //b
    draw();
}
 if (key == 'c') {
    teller = 0;
    zin ="F"; len = 5*n; hoek = radians(22.5);
    regels[0] = { a: "F", b: "FF-[-F+F+F]+[+F-F-F]"}  //c
    draw();
}
 if (key == 'g') {
    teller = teller + 1;
    if (teller < 6){
     linZin();
   }
  }
}