UNPKG

@thi.ng/grid-iterators

Version:

2D grid and shape iterators w/ multiple orderings

35 lines (34 loc) 1.05 kB
function* clipped(src, left, top, right, bottom) { for (let p of src) { if (p[0] >= left && p[0] < right && p[1] >= top && p[1] < bottom) yield p; } } const __axis = (a, b, c) => (a < b ? a - b : a > b + c ? a - b - c : 0) ** 2; const intersectRectCircle = (x, y, w, h, cx, cy, r) => __axis(cx, x, w) + __axis(cy, y, h) <= r * r; const liangBarsky = (ax, ay, bx, by, minx, miny, maxx, maxy) => { const dx = bx - ax; const dy = by - ay; let alpha = 0; let beta = 1; const clip = (p, q) => { if (p < 0) { const r = q / p; if (r > beta) return false; r > alpha && (alpha = r); } else if (p > 0) { const r = q / p; if (r < alpha) return false; r < beta && (beta = r); } else if (q < 0) { return false; } return true; }; return clip(-dx, ax - minx) && clip(dx, maxx - ax) && clip(-dy, ay - miny) && clip(dy, maxy - ay) ? [alpha * dx + ax, alpha * dy + ay, beta * dx + ax, beta * dy + ay] : void 0; }; export { clipped, intersectRectCircle, liangBarsky };