(a, b, two)
| 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)) { |
no test coverage detected