@thi.ng/grid-iterators
Version:
2D grid and shape iterators w/ multiple orderings
35 lines (34 loc) • 1.05 kB
JavaScript
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
};