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

Function polygonContains

external/.d3.js:10630–10695  ·  view source on GitHub ↗
(polygon, point)

Source from the content-addressed store, hash-verified

10628}
10629
10630function 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

Callers 2

clipFunction · 0.85
containsPolygonFunction · 0.85

Calls 6

addMethod · 0.95
longitudeFunction · 0.85
cartesianCrossFunction · 0.85
cartesianFunction · 0.85
asin$1Function · 0.85

Tested by

no test coverage detected