d3-jsnext
Version:
d3, but futuristic
66 lines (60 loc) • 1.33 kB
JavaScript
// Liang–Barsky line clipping.
function d3_geom_clipLine(x0, y0, x1, y1) {
return function(line) {
var a = line.a,
b = line.b,
ax = a.x,
ay = a.y,
bx = b.x,
by = b.y,
t0 = 0,
t1 = 1,
dx = bx - ax,
dy = by - ay,
r;
r = x0 - ax;
if (!dx && r > 0) return;
r /= dx;
if (dx < 0) {
if (r < t0) return;
if (r < t1) t1 = r;
} else if (dx > 0) {
if (r > t1) return;
if (r > t0) t0 = r;
}
r = x1 - ax;
if (!dx && r < 0) return;
r /= dx;
if (dx < 0) {
if (r > t1) return;
if (r > t0) t0 = r;
} else if (dx > 0) {
if (r < t0) return;
if (r < t1) t1 = r;
}
r = y0 - ay;
if (!dy && r > 0) return;
r /= dy;
if (dy < 0) {
if (r < t0) return;
if (r < t1) t1 = r;
} else if (dy > 0) {
if (r > t1) return;
if (r > t0) t0 = r;
}
r = y1 - ay;
if (!dy && r < 0) return;
r /= dy;
if (dy < 0) {
if (r > t1) return;
if (r > t0) t0 = r;
} else if (dy > 0) {
if (r < t0) return;
if (r < t1) t1 = r;
}
if (t0 > 0) line.a = {x: ax + t0 * dx, y: ay + t0 * dy};
if (t1 < 1) line.b = {x: ax + t1 * dx, y: ay + t1 * dy};
return line;
};
}
export { d3_geom_clipLine };