Spaces:
Sleeping
Sleeping
| 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; | |
| }; | |
| } | |