Yet another Vera Molnar homage
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();
//adding some random jitter
const skew = 0; //min = 0, max = 100, step = 2
//how often to try packing large squares
const iterations = 20; //min = 0, max = 100, step = 1
//how dense to fill the squares
const sparseness = 2; //min = 1, max = 100, step = 0.1
//largest allowable square
const maxSize = 19; //min = 1, max = 19, step = 1
function randomNumber(min, max) {
return Math.floor(Math.random() * (max - min) + min);
}
function drawSquare (size) {
turtle.setheading(0);
turtle.right((skew*Math.random()-skew/2)/size);
turtle.forward(size);
turtle.right(90);
turtle.forward(size);
turtle.right(90);
turtle.forward(size);
turtle.right(90);
turtle.forward(size);
}
function filledSquares(size) {
currentSize = size;
startPos = turtle.position();
drawSquare(currentSize);
for (let i = 0; i < randomNumber(1,size*size/sparseness); i++) {
offset = randomNumber(0,(size-1)/2);
currentSize = size - (2*offset);
turtle.setheading(0);
turtle.penup();
turtle.forward(offset);
turtle.right(90);
turtle.forward(offset);
turtle.pendown();
drawSquare(currentSize);
turtle.jump(startPos);
}
}
var arr = [];
function initGrid() {
for(let i = 0; i < 20; i++) {
arr[i]=[];
for(let j = 0; j < 20; j++) {
arr[i][j]=0;
}
}
}
//create larger squares
function squarePack() {
for (let i=0; i<iterations;i++) {
squareSize = randomNumber(2,5)
squarex = randomNumber(0,19);
squarey = randomNumber(0,19);
squareOkay = true;
for (let x=0; x<squareSize; x++) {
for (let y=0; y<squareSize; y++) {
if (squarex+x > 19 || squarey+y >19) {
squareOkay = false;
}
else if (arr[squarex+x][squarey+y]!=0) {
squareOkay = false;
}
}
}
if (squareOkay=true) {
for (let x=0; x<squareSize; x++) {
for (let y=0; y<squareSize; y++) {
posx = squarex+x;
posy = squarey+y;
console.log(posx + " " + posy);
arr[posx][posy] = 1;
}
}
turtle.jump((squarex*10)-100,(squarey*10)-100);
filledSquares((squareSize * 10)-1);
}
}
}
// The walk function will be called until it returns false.
function walk(r) {
initGrid();
// pack larger squares
for (let i=0; i<iterations;i++) {
squareSize = randomNumber(2,maxSize)
squarex = randomNumber(0,19);
squarey = randomNumber(0,19);
squareOkay = true;
for (let x=0; x<squareSize; x++) {
for (let y=0; y<squareSize; y++) {
if (squarex+x > 19 || squarey+y >19) {
squareOkay = false;
}
else if (arr[squarex+x][squarey+y]!=0) {
squareOkay = false;
}
}
}
if (squareOkay==true) {
for (let x=0; x<squareSize; x++) {
for (let y=0; y<squareSize; y++) {
posx = squarex+x;
posy = squarey+y;
arr[posx][posy] = 1;
}
}
turtle.jump((squarex*10)-100,(squarey*10)-100);
filledSquares((squareSize * 10)-1);
}
}
//fill in blank spots with little squares
for(let x = 0; x < 20; x++) {
for(let y = 0; y < 20; y++) {
if (arr[x][y]==0) {
turtle.jump((x*10)-100,(y*10)-100);
filledSquares(9)
}
}
}
return r = false;
}