@thi.ng/grid-iterators
Version:
2D grid and shape iterators w/ multiple orderings
40 lines (39 loc) • 856 B
JavaScript
import { __opts } from "./utils.js";
function* spiral2d(opts) {
const { cols, rows, tx } = __opts(opts);
const num = cols * rows;
const center = Math.min(cols, rows) - 1 >> 1;
for (let i = 0; i < num; i++) {
let nx = cols;
let ny = rows;
while (i < nx * ny) {
nx--;
ny--;
}
const nxny = nx * ny;
const minnxny = Math.min(nx, ny);
const m2 = minnxny >> 1;
let bx, by;
if (minnxny & 1) {
if (i <= nxny + ny) {
bx = nx - m2;
by = -m2 + i - nxny;
} else {
bx = nx - m2 - (i - (nxny + ny));
by = ny - m2;
}
} else {
if (i <= nxny + ny) {
bx = -m2;
by = ny - m2 - (i - nxny);
} else {
bx = -m2 + (i - (nxny + ny));
by = -m2;
}
}
yield tx(bx + center, by + center);
}
}
export {
spiral2d
};