one more
Log in to post a comment.
// You can find the Turtle API reference here: https://turtletoy.net/syntax
Canvas.setpenopacity(1);
const iterations = 4; //min = 0, max = 8, step = 1
const size = 80; //min = 10, max = 100, step = 1
const square = 1 // min = 0, max =1, step = 0.1
// Global code will be evaluated once.
const turtle = new Turtle();
function rotate(x,y, n = 1){
let tmp = 0;
for(let i = 0; i < n; i++){
tmp = x;
x = -y;
y = tmp;
}
return [x, y];
}
function deadEnd(x, y, s, h){
let posx = -s;
let posy = -s/4;
[posx, posy] = rotate(posx, posy, h);
turtle.jump(x+posx, y+posy);
turtle.seth(h * 90);
turtle.forward(square * s/4);
turtle.circle(s/4, 180);
turtle.forward(square * s/4);
}
function line(x, y, s, h){
let posx = -s;
let posy = 0;
let ox = 0;
let oy = s/4;
[posx, posy] = rotate(posx, posy, h);
[ox, oy] = rotate(ox, oy, h);
turtle.jump(x+posx+ox, y+posy+oy);
[posx, posy] = rotate(posx, posy);
[posx, posy] = rotate(posx, posy);
turtle.goto(x+posx+ox, y+posy+oy);
[ox, oy] = rotate(ox, oy);
[ox, oy] = rotate(ox, oy);
turtle.jump(x+posx+ox, y+posy+oy);
[posx, posy] = rotate(posx, posy);
[posx, posy] = rotate(posx, posy);
turtle.goto(x+posx+ox, y+posy+oy);
/*
turtle.jump(x+posx, y+posy);
turtle.seth(h * 90);
turtle.forward(2*s);
turtle.right(90);
turtle.up();
turtle.forward(s/2);
turtle.down();
turtle.right(90);
turtle.forward(2*s);
*/
}
function crossing(x, y, s){
let posx = -s;
let posy = s/4;
let tmp = 0;
for(let i = 0; i < 4; i++){
turtle.jump(x+posx, y+posy);
turtle.seth(i * 90);
turtle.forward(square * s/4);
turtle.circle((1 - square) * s/4 + s/2, 90);
turtle.forward(square * s/4);
[posx, posy] = rotate(posx, posy);
}
}
function curve(x, y, s, h, dir){
let posx = -s;
let posy = 0;
let ox = 0;
let oy = s/4;
if(dir < 0) oy =- oy;
[posx, posy] = rotate(posx, posy, h);
[ox, oy] = rotate(ox, oy, h);
turtle.jump(x+posx+ox, y+posy+oy);
turtle.seth(h * 90);
turtle.forward(square * s/4);
turtle.circle(dir * ((1-square) * s/4 + 1/2 * s), 90);
turtle.forward(square * s/4);
[ox, oy] = rotate(ox, oy);
[ox, oy] = rotate(ox, oy);
turtle.jump(x+posx+ox, y+posy+oy);
turtle.seth(h * 90);
turtle.forward(square * s/4);
turtle.circle(dir * ((1-square) * s/4 + s), 90);
turtle.forward(square * s/4);
}
function divide(x, y, s, l){
if(l == 0){
const rand = Math.random();
if(rand < 0.2){
// first tile type is all off.
deadEnd(x, y, s, 0);
deadEnd(x, y, s, 1);
deadEnd(x, y, s, 2);
deadEnd(x, y, s, 3);
} else if(rand < 0.4){
// second tile type is crossing ahead
if(Math.random() < 0.5){
line(x, y, s, 0);
deadEnd(x, y, s, 1);
deadEnd(x, y, s, 3);
} else {
line(x, y, s, 1);
deadEnd(x, y, s, 0);
deadEnd(x, y, s, 2);
}
} else if(rand < 0.6){
// third tile type is everything opens
crossing(x, y, s);
} else if(rand){
let direction = 1;
if(Math.random() < 0.5) direction *= -1;
let rotation = Math.floor(Math.random() * 4);
curve(x, y, s, rotation, direction);
if(Math.random() < 0.5){
// We draw a second curve, rotated 90°
curve(x, y, s, rotation + 2, direction);
} else {
// We draw two dead ends on the remaining borders.
deadEnd(x, y, s, rotation + 2);
if(direction == 1) deadEnd(x, y, s, rotation + 1);
else deadEnd(x, y, s, rotation + 3);
}
}
} else {
l--;
s /= 2;
divide(x+s, y+s, s, l);
divide(x+s, y-s, s, l);
divide(x-s, y+s, s, l);
divide(x-s, y-s, s, l);
}
}
divide(0, 0, size, iterations)
// The walk function will be called until it returns false.
function walk(i) {
return false;
}