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