Simple squares whose rotations depend on their distance and angle to the midpoint.
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();
// Adjustable variables.
const len = 5; // min=1, max=100, step=1
const space = 4; // min=1, max=100, step=.1
const rows = 20; // min=1, max=50, step=1
const columns = 20; // min=1, max=50, step=1
// The walk function will be called until it returns false.
function walk(i) {
if(!(function() {
var row = Math.floor(i / columns);
column = i % columns;
if(row >= rows)
return false;
// Position.
turtle.jump(-((columns-1) * (len+space) / 2) + column * (len+space),-((rows-1) * (len+space) / 2) + row * (len+space));
// Calculate rotation.
let x = column - columns/2,
y = row - rows/2,
angle = Math.atan2(x,y) * 180 / Math.PI,
distance = Math.sqrt(x*x + y*y) / (columns/2),
rotation = Math.max(0,1 - distance) * 90 + angle;
// Rotate.
turtle.right(rotation);
// Draw box.
box();
// Reset rotation.
turtle.left(rotation);
return true;
})()) {
finish();
return false;
}
return true;
}
// Evaluated once at the end.
function finish() {
// Cut the frame last.
const frameWidth = columns * (len+space) + 8,
frameHeight = rows * (len+space) + 8;
turtle.jump(-frameWidth/2,-frameHeight/2);
turtle.setheading(0);
turtle.pendown();
turtle.forward(frameWidth);
turtle.right(90);
turtle.forward(frameHeight);
turtle.right(90);
turtle.forward(frameWidth);
turtle.right(90);
turtle.forward(frameHeight);
}
function box() {
turtle.penup();
turtle.backward(len/2);
turtle.left(90);
turtle.forward(len/2);
turtle.right(90);
turtle.pendown();
for(var i = 0; i < 4; i++) {
turtle.forward(len);
turtle.right(90);
}
}