Files
EMVs-Creative-coding/Week-4/l-system.js
2026-06-08 10:33:47 +02:00

69 lines
1.5 KiB
JavaScript

let angle;
let axiom = "F";
let sentence = axiom;
let len = 100;
let rules = [];
rules[0] = {
a: "F",
b: "FF-[-F-F-F]+[+F+F+F]FF*[*F/F/F]/[/F*F*F]FF*[*F/F/F]/[/F*F*F]FF-[-F-F-F]+[+F+F+F]FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
// c: "FF*[*F/F/F]/[/F*F*F]",
};
function generate() {
len *= 0.5;
let nextSentence = "";
for (let i = 0; i < sentence.length; i++) {
let current = sentence.charAt(i);
let found = false;
for (let j = 0; j < rules.length; j++) {
if (current == rules[j].a) {
found = true;
nextSentence += rules[j].b;
break;
}
}
if (!found) {
nextSentence += current;
}
}
sentence = nextSentence;
// createP(sentence);
turtle();
}
function turtle() {
background(51);
resetMatrix();
translate(width / 2, height);
stroke(255, 100);
for (let i = 0; i < sentence.length; i++) {
let current = sentence.charAt(i);
if (current == "F") {
line(0, 0, 0, -len);
translate(0, -len);
} else if (current == "+") {
rotate(angle);
} else if (current == "-") {
rotate(-angle);
} else if (current == "*") {
rotate(angle * 2);
} else if (current == "/") {
rotate(angle / 2);
} else if (current == "[") {
push();
} else if (current == "]") {
pop();
}
}
}
function setup() {
createCanvas(400, 400);
angle = radians(10);
background(51);
createP(axiom);
turtle();
let button = createButton("generate");
button.mousePressed(generate);
}