xxxxxxxxxx
79
// Coding Rainbow
// Daniel Shiffman
// http://patreon.com/codingtrain
// Code for: https://youtu.be/E1B4UoSQMFw
// Modified by Thomas Povinelli
/**
The iterate function receives an axiom to start with and returns a JavaScript
generator object which repeatedly applies the given rules to the axiom.
If a letter appears in the string but not in the rules it is not altered on
iteration. If a letter appears in the rules, it is replaced with the given
replacement
Rules should always have single letter keys
*/
function *iterate(axiom, rules) {
let choices = Object.keys(rules);
let pattern = `(${choices.join('|')})`;
let regex = new RegExp(pattern, 'g');
while (true) {
yield axiom;
axiom = axiom.replace(regex, (match, group) => {
let replacement = rules[group];
return replacement || group;
});
}
}
function turtle(sentence, angle, len) {
background(51);
resetMatrix();
translate(width / 2, height);
stroke(255, 100);
for (var i = 0; i < sentence.length; i++) {
var 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 == "[") {
push();
} else if (current == "]") {
pop();
}
}
}
function setup() {
createCanvas(400, 400);
background(51);
// graphical parameters
let angle = radians(25);
let len = 200;
// L-System parameters
const axiom = 'F';
let rules = {
'F': 'FF+[+F-F-F]-[-F+F+F]',
}
let sentence = axiom;
let lsystem = iterate(axiom, rules);
let button = createButton("generate");
button.mousePressed(() => {
len *= 0.5;
sentence = lsystem.next().value;
createP(sentence);
turtle(sentence, angle, len);
});
}