Metagons 🔯

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);
    }
}