A random scribble L-system
Log in to post a comment.
// Using base L-System implementation from reinder // Global code will be evaluated once. Canvas.setpenopacity(1); const turtle = new Turtle(); let distance = 1; let angle = 90; // l-system function createLSystem(numIters, axiom) { let s = axiom; for (let i=0; i<numIters; i++) { s = processString(s); } return s; } function processString(oldStr) { let newstr = ""; for (let i=0; i<oldStr.length; i++) { newstr += applyRules(oldStr[i]); } return newstr; } function applyRules(ch) { switch (ch) { case "A": return "B[BA-AB]B"; case "B": return "A*[F+A+AF+BFAF]FB"; default: return ch; } } turtle.setheading(45); const inst = createLSystem(7, "AB*BA"); // number of iterations and axiom states = []; // The walk function will be called until it returns false. function walk(i) { const cmd = inst[i]; switch (cmd) { case "F": turtle.forward(distance); break; case "-": turtle.right(angle); break; case "+": turtle.left(angle); break; case "*": u = (Math.random() * 2.0 - 1.0) * 95; v = (Math.random() * 2.0 - 1.0) * 95; turtle.left(Math.random() * Math.PI * 0.5); if (Math.random() > 0.75) { turtle.penup(); turtle.goto(u,v); turtle.pendown(); } case "[": states.push({ x: turtle.ycor(), y: turtle.xcor(), h: Math.PI - turtle.heading() }); break; case "]": const state = states.pop(); turtle.penup(); turtle.goto(state.x, state.y); turtle.setheading(state.h); turtle.pendown(); break; } return i < inst.length - 1; }