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); }