Log in to post a comment.

// You can find the Turtle API reference here: https://turtletoy.net/syntax
Canvas.setpenopacity(1);

// Global code will be evaluated once.
const turtle = new Turtle();
turtle.penup();

const amount = 45; // min=15, max=75, step=1
const border = 1; // min=0, max=1, step=1
const draw_size = border ? 175 / amount : 200  / amount;
const buffer = [];

const FILLED = 1;
const EMPTY = 0;

const shape = 0; // min=0, max=2, step=1 (Gradient, Rectangle, Circle)

// borrowed from <https://turtletoy.net/turtle/cc4d10a96c>
let p;
if (shape == 0) p = (x,y) => x;
else if (shape == 1) p = (x,y) => .7;
else if (shape == 2) p = (x,y) => 1-3*Math.pow((x-.5)*(x-.5)+(y-.5)*(y-.5),.75);

const buffer_size = amount;

function init_buffer() {
    iter(buffer_size, y => iter(buffer_size, x => {
        buffer[y * buffer_size + x] = Math.random() > p(x / buffer_size,y / buffer_size) ? FILLED : EMPTY;
    }));
}

// The walk function will be called until it returns false.
function walk(i) {
    if (i === 0) init_buffer();
    const x =  i % buffer_size;
    const y =  i / buffer_size | 0;
    if (isFilled(i)) {
        if (y === 0 || !isFilled(i - buffer_size)) { // above
            line(x, y, x + 1, y);
        }
        if (y === buffer_size - 1 || !isFilled(i + buffer_size)) { // below
            line(x, y + 1, x + 1, y + 1);
        }
        if (x === 0 || !isFilled(i - 1)) {  // left
            line(x, y, x, y + 1);
        }
        if (x === buffer_size - 1 || !isFilled(i + 1)) {  // right
            line(x + 1, y, x + 1, y + 1);
        } 
    }
    return i < buffer_size*buffer_size;
}

const line = (x1,y1,x2,y2) => {
    x1 -= buffer_size / 2;
    x2 -= buffer_size / 2;
    y1 -= buffer_size / 2;
    y2 -= buffer_size / 2;
    turtle.goto(x1 * draw_size, y1 * draw_size);
    turtle.pendown();
    turtle.goto(x2 * draw_size, y2 * draw_size);
    turtle.penup();
};
const isFilled = i => buffer[i] == FILLED;
const iter = (to, cb) => { for(let v = 0; v < to; v++) cb(v); }