A Turtle Grows in Brooklyn

A depth-first binary tree.

Log in to post a comment.

Canvas.setpenopacity(0.85);

const turtle = new Turtle();
const nodeDistance = 10;
const maxDepth = 10;
const angle = 90;
const positions = [{x: 0, y: 30, h: 180, r: true, d: 0}];
const savePos = (x, y, h, r, d) => positions.push({x, y, h, r, d});
const getLastPos = () => positions.pop();

function walk(i) {
    const lastPos = getLastPos();
    if (!lastPos) return false; // stop drawing when the tree is done
    turtle.penup();
    turtle.goto(lastPos.x, lastPos.y);
    turtle.setheading(lastPos.h);
    turtle.pendown();
    if (lastPos.r) {
        turtle.right(angle/(lastPos.d+1));    
        turtle.forward(nodeDistance);
        if (lastPos.d < maxDepth) {
            savePos(turtle.x(), turtle.y(), turtle.h(), true, lastPos.d+1);
            savePos(turtle.x(), turtle.y(), turtle.h(), false, lastPos.d+1);
        }
    }
    else {
        turtle.left(angle/(lastPos.d+1));    
        turtle.forward(nodeDistance);
        if (lastPos.d < maxDepth) {
            savePos(turtle.x(), turtle.y(), turtle.h(), false, lastPos.d+1);
            savePos(turtle.x(), turtle.y(), turtle.h(), true, lastPos.d+1);
        }
    }
    
    return i < 20000;
}