Canvas.setpenopacity(1); const turtle = new Turtle(); const camera = { pos: [230, -120, 0], pan: [160, -25, 0], f: 120, } const randomish = 2.5; function walk(i, t = 0) { if (i==0) rseed = seed; for(let j =-8;j<8; j++) { const size = 15.9 + (i*1.5); const sizeInner = 14 + (i*1.5); const sizeDiff = size-sizeInner; const h = (j-t) * (size*4) for (let c=0; c<2; c++) { const z = (-size + c) * size; const plane = [ [-size,-size+h, z], [-size, size+h, z], [ size, size+h, z], [ size,-size+h, z], ]; drawPlane(plane); } for (let c=0; c<2; c++) { const x = c == 0 ? - size : size; const zfront = (-size) * size + sizeDiff; const zback = (-size + 1) * size - sizeDiff; const plane = [ [x, size+h, zfront], [x, size+h, zback ], [x, -size+h, zback ], [x, -size+h, zfront], ]; drawPlane(plane); } for (let c=0; c<2; c++) { const y = c == 0 ? - size : size; const zfront = (-size) * size + sizeDiff; const zback = (-size + 1) * size - sizeDiff; const plane = [ [sizeInner , y+h, zfront], [sizeInner , y+h, zback ], [-sizeInner, y+h, zback ], [-sizeInner, y+h, zfront], ]; drawPlane(plane); } } return i < 10; } function drawPlane(segments) { turtle.penup(); for(let s=0, l=segments.length; s<=l; s++) { if (s==1) turtle.pendown(); let segment = segments[s % l]; segment = randomize(segment, randomish); segment = add(segment, camera.pos); segment = project(segment); segment = add(segment, camera.pan); turtle.goto(segment); } } /**************************************************/ // some functions from https://turtletoy.net/turtle/2dc4806767 function project(p) { p[2] += camera.f; return [p[0]/p[2]*camera.f, p[1]/p[2]*camera.f, p[2]]; } const randomize = (p, v, s) => { p[0] += -v * 0.5 + hash(123+p[1]/10|0) * v; p[1] += -v * 0.5 + hash(3*p[1]/10|0) * v; p[2] += -v * 0.5 + hash(-444+2*p[1]/10|0) * v; return p; }; const cos = Math.cos; const sin = Math.sin; const scale = (p,scale) => [p[0]*scale, p[1]*scale, p[2]*scale]; const add = (a,b) => [a[0]+b[0], a[1]+b[1], a[2]+b[2]]; const sub = (a,b) => [a[0]-b[0], a[1]-b[1], a[2]-b[2]]; const cross = (a,b) => [ a[1]*b[2]-b[1]*a[2], a[2]*b[0]-b[2]*a[0], a[0]*b[1]-b[0]*a[1] ]; const seed = 1234; // pseudo random methods function hash(p) { p += seed; p = 1103515245 * (((p) >> 1) ^ (p)); p = 1103515245 * (p ^ (p>>3)); p = p ^ (p >> 16); return p / 1103515245 % 1; } let rseed = seed; function rand() { let r = 1103515245 * (((rseed) >> 1) ^ (rseed++)); r = 1103515245 * (r ^ (r>>3)); r = r ^ (r >> 16); return r / 1103515245 % 1; }