MCPcopy Create free account
hub / github.com/breck7/scroll / intersect

Function intersect

external/.d3.js:11006–11068  ·  view source on GitHub ↗
(a, b, two)

Source from the content-addressed store, hash-verified

11004
11005 // Intersects the great circle between a and b with the clip circle.
11006 function intersect(a, b, two) {
11007 var pa = cartesian(a),
11008 pb = cartesian(b);
11009
11010 // We have two planes, n1.p = d1 and n2.p = d2.
11011 // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
11012 var n1 = [1, 0, 0], // normal
11013 n2 = cartesianCross(pa, pb),
11014 n2n2 = cartesianDot(n2, n2),
11015 n1n2 = n2[0], // cartesianDot(n1, n2),
11016 determinant = n2n2 - n1n2 * n1n2;
11017
11018 // Two polar points.
11019 if (!determinant) return !two && a;
11020
11021 var c1 = cr * n2n2 / determinant,
11022 c2 = -cr * n1n2 / determinant,
11023 n1xn2 = cartesianCross(n1, n2),
11024 A = cartesianScale(n1, c1),
11025 B = cartesianScale(n2, c2);
11026 cartesianAddInPlace(A, B);
11027
11028 // Solve |p(t)|^2 = 1.
11029 var u = n1xn2,
11030 w = cartesianDot(A, u),
11031 uu = cartesianDot(u, u),
11032 t2 = w * w - uu * (cartesianDot(A, A) - 1);
11033
11034 if (t2 < 0) return;
11035
11036 var t = sqrt$2(t2),
11037 q = cartesianScale(u, (-w - t) / uu);
11038 cartesianAddInPlace(q, A);
11039 q = spherical(q);
11040
11041 if (!two) return q;
11042
11043 // Two intersection points.
11044 var lambda0 = a[0],
11045 lambda1 = b[0],
11046 phi0 = a[1],
11047 phi1 = b[1],
11048 z;
11049
11050 if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
11051
11052 var delta = lambda1 - lambda0,
11053 polar = abs$1(delta - pi$1) < epsilon$1,
11054 meridian = polar || delta < epsilon$1;
11055
11056 if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
11057
11058 // Check that the first point is between a and b.
11059 if (meridian
11060 ? polar
11061 ? phi0 + phi1 > 0 ^ q[1] < (abs$1(q[0] - lambda0) < epsilon$1 ? phi0 : phi1)
11062 : phi0 <= q[1] && q[1] <= phi1
11063 : delta > pi$1 ^ (lambda0 <= q[0] && q[0] <= lambda1)) {

Callers 2

clipLineFunction · 0.85
arcFunction · 0.85

Calls 6

cartesianFunction · 0.85
cartesianCrossFunction · 0.85
cartesianDotFunction · 0.85
cartesianScaleFunction · 0.85
cartesianAddInPlaceFunction · 0.85
sphericalFunction · 0.85

Tested by

no test coverage detected