67 lines
1.3 KiB
JavaScript
67 lines
1.3 KiB
JavaScript
import "../math/trigonometry";
|
||
|
||
// 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;
|
||
};
|
||
}
|