Be sure to play with the 'phasePermille' slider to simulate the video at reddit.com/r/generative/comments/tpwp57/metagons/
Concept: reddit.com/user/iqof…ns_infinite_looping/
Log in to post a comment.
// You can find the Turtle API reference here: https://turtletoy.net/syntax Canvas.setpenopacity(.8); // Global code will be evaluated once. const turtle = new Turtle(); const phasePermille = 0; //min=0 max=1000 step=1 const grid = 8; //min=1 max=15 step=1 const border = 0; //min=0 max=10 step=1 const cellMargin = 2; //min=0 max=10 step=1 turtle.radians(); const pi2 = Math.PI * 2; const cellSize = (200 - border - border) / grid; const phase = phasePermille / 1000 * pi2; const tr = (location, size, pt) => [location[0] + (size / 2) * pt[0], location[1] + (size / 2) * pt[1]] const cl = (pt) => [pt[0] - grid/2*cellSize, pt[1] - grid/2*cellSize] const add2 = (a, b) => [a[0]+b[0], a[1]+b[1]]; const scale2 = (a, s) => [a[0]*s, a[1]*s]; // The walk function will be called until it returns false. function walk(i) { const col = i % grid; const row = i / grid | 0; drawCell(cl([(col + .5) * cellSize, (row + .5) * cellSize]), cellSize - cellMargin, row + 1, col + 1); return i < grid**2 - 1; } function drawCell(location, size, classe, n) { let ro = Math.cos(phase * 3) / 4; for(let i = 0; i < n; i++) { let o = [Math.sin(phase + (i * pi2 / n)) / 4, -Math.cos(phase + (i * pi2 / n)) / 4]; drawElement(tr(location, size, scale2(o, 1 + ro)), size * 2/3, classe, (i * pi2 / n)); } } function drawElement(location, size, classe, orientation) { if(classe == 1) { turtle.jump(add2(location, [0, -.25])); turtle.circle(.25); return; } const hSize = size / 2; for(let i = 0; i <= classe; i++) { const add = [ Math.sin(((i/classe) * pi2) + (phase * 4) + orientation) * hSize, -Math.cos(((i/classe) * pi2) + (phase * 4) + orientation) * hSize ]; const pt = add2(location, add); i==0? turtle.jump(pt): turtle.goto(pt); } }