UNPKG

@thi.ng/grid-iterators

Version:

2D grid and shape iterators w/ multiple orderings

40 lines (39 loc) 856 B
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 };