(polygon, point)
| 10628 | } |
| 10629 | |
| 10630 | function polygonContains(polygon, point) { |
| 10631 | var lambda = longitude(point), |
| 10632 | phi = point[1], |
| 10633 | sinPhi = sin$1(phi), |
| 10634 | normal = [sin$1(lambda), -cos$1(lambda), 0], |
| 10635 | angle = 0, |
| 10636 | winding = 0; |
| 10637 | |
| 10638 | var sum = new Adder(); |
| 10639 | |
| 10640 | if (sinPhi === 1) phi = halfPi$1 + epsilon$1; |
| 10641 | else if (sinPhi === -1) phi = -halfPi$1 - epsilon$1; |
| 10642 | |
| 10643 | for (var i = 0, n = polygon.length; i < n; ++i) { |
| 10644 | if (!(m = (ring = polygon[i]).length)) continue; |
| 10645 | var ring, |
| 10646 | m, |
| 10647 | point0 = ring[m - 1], |
| 10648 | lambda0 = longitude(point0), |
| 10649 | phi0 = point0[1] / 2 + quarterPi, |
| 10650 | sinPhi0 = sin$1(phi0), |
| 10651 | cosPhi0 = cos$1(phi0); |
| 10652 | |
| 10653 | for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { |
| 10654 | var point1 = ring[j], |
| 10655 | lambda1 = longitude(point1), |
| 10656 | phi1 = point1[1] / 2 + quarterPi, |
| 10657 | sinPhi1 = sin$1(phi1), |
| 10658 | cosPhi1 = cos$1(phi1), |
| 10659 | delta = lambda1 - lambda0, |
| 10660 | sign = delta >= 0 ? 1 : -1, |
| 10661 | absDelta = sign * delta, |
| 10662 | antimeridian = absDelta > pi$1, |
| 10663 | k = sinPhi0 * sinPhi1; |
| 10664 | |
| 10665 | sum.add(atan2$1(k * sign * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta))); |
| 10666 | angle += antimeridian ? delta + sign * tau$1 : delta; |
| 10667 | |
| 10668 | // Are the longitudes either side of the point’s meridian (lambda), |
| 10669 | // and are the latitudes smaller than the parallel (phi)? |
| 10670 | if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) { |
| 10671 | var arc = cartesianCross(cartesian(point0), cartesian(point1)); |
| 10672 | cartesianNormalizeInPlace(arc); |
| 10673 | var intersection = cartesianCross(normal, arc); |
| 10674 | cartesianNormalizeInPlace(intersection); |
| 10675 | var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin$1(intersection[2]); |
| 10676 | if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { |
| 10677 | winding += antimeridian ^ delta >= 0 ? 1 : -1; |
| 10678 | } |
| 10679 | } |
| 10680 | } |
| 10681 | } |
| 10682 | |
| 10683 | // First, determine whether the South pole is inside or outside: |
| 10684 | // |
| 10685 | // It is inside if: |
| 10686 | // * the polygon winds around it in a clockwise direction. |
| 10687 | // * the polygon does not (cumulatively) wind around it, but has a negative |
no test coverage detected