Hex subdivision

General idea vaguely inspired by "Substrate" but someone probably has done this variation as well.

Log in to post a comment.

let w = 95; // min=2, max=1024 step=1
let h = 215; // min=2, max=1024 step=1
let cell_size = 0.83; // min=0.01 max=50 step=0.01
let flip = 0.5; // min=0, max=1, step=0.001
let gap = 0.7; // min=0 max=5 step=0.001
let count = 450; // min=1 max=20000 step=1

function init2()
{
    turtle.penup();
}

let th = cell_size * Math.sqrt(3) * 0.5;

let h_total = (h - 1) * cell_size;
let w_total = (w - 1) * th;

function rec_to_ab(p) {
    return [p[0], p[1]-p[0]/2];
}

function rec_to_xy(p) {
    let x = p[0] * th;
    let y = p[1] * cell_size + (p[0]%2 ? 1 : 0) * cell_size * 0.5;
    x -= 0.5 * w_total;
    y -= 0.5 * h_total;
    return [x, y];
}

const D = [
    [[0, 1],[-1, 0], [-1, -1], [0, -1], [1, -1], [1, 0]],
    [[0, 1],[-1, 1], [-1, 0], [0, -1], [1, 0], [1, 1]]
];

const DXY = [
    [0, cell_size], [-th, 0.5 * cell_size], [-th, -0.5*cell_size],
    [0, -cell_size], [th, -0.5 * cell_size], [th, 0.5*cell_size]
];

function dir(p, d) {
    let d_p = D[(p[0]%2+2)%2][d];
    return [p[0]+d_p[0], p[1]+d_p[1]];
}

let filled =  Array.from({ length: h }, (_, i) => 
    Array.from({ length: w }, (_, i) => 0)
);

function is_empty(p) {
    if (p[0] < 0 || p[0] >= w || p[1] < 0 || p[1] >= h) {
        return false;
    }
    return !filled[p[1]][p[0]];
}

function walk(i) {
    if (i >= count) {
        return false;
    }
    let x = Math.floor(Math.random()*w);
    let y = Math.floor(Math.random()*h);
    let p = [x, y];
    if (!is_empty(p)) {
        return true;
    }
    for (let d = (Math.random() < flip ? 1 : 0); d<6; d+= 2) {
        let p2 = dir(p, d);
        while (is_empty(p2)) {
            filled[p2[1]][p2[0]] = 1;
            p2 = dir(p2, d);
        }
        turtle.goto(rec_to_xy(p));
        turtle.pendown();
        let p2_xy = rec_to_xy(p2);
        p2_xy[0] -= gap * DXY[d][0];
        p2_xy[1] -= gap * DXY[d][1];
        turtle.goto(p2_xy);
        turtle.penup();
    }
    filled[p[1]][p[0]] = 1;
    return i < count;
}


if (typeof Canvas != 'undefined') {
    //console.log("init browser");
    Canvas.setpenopacity(1);
    turtle = new Turtle();
    init2();
} else {
    //console.log("init standalone");
    import('./testTurtle.js').then((mod) => {
        turtle = new mod.TestTurtle();
        init2();
        let i = 0;
        while (walk(i)) {
            ++i;
        }
        turtle.finishSVG();
    });
}