Spatial4n.Core.Shapes.Impl.GeoCircle.RelateRectangleCircleWrapsPole C# (CSharp) Method

RelateRectangleCircleWrapsPole() private method

private RelateRectangleCircleWrapsPole ( Rectangle r, SpatialContext ctx ) : SpatialRelation
r Rectangle
ctx Spatial4n.Core.Context.SpatialContext
return SpatialRelation
        private SpatialRelation RelateRectangleCircleWrapsPole(Rectangle r, SpatialContext ctx)
        {
            //This method handles the case where the circle wraps ONE pole, but not both.  For both,
            // there is the inverseCircle case handled before now.  The only exception is for the case where
            // the circle covers the entire globe, and we'll check that first.
            if (radiusDEG == 180)//whole globe
                return SpatialRelation.CONTAINS;

            //Check if r is within the pole wrap region:
            double yTop = GetCenter().GetY() + radiusDEG;
            if (yTop > 90)
            {
                double yTopOverlap = yTop - 90;
                Debug.Assert(yTopOverlap <= 90, "yTopOverlap: " + yTopOverlap);
                if (r.GetMinY() >= 90 - yTopOverlap)
                    return SpatialRelation.CONTAINS;
            }
            else
            {
                double yBot = point.GetY() - radiusDEG;
                if (yBot < -90)
                {
                    double yBotOverlap = -90 - yBot;
                    Debug.Assert(yBotOverlap <= 90);
                    if (r.GetMaxY() <= -90 + yBotOverlap)
                        return SpatialRelation.CONTAINS;
                }
                else
                {
                    //This point is probably not reachable ??
                    Debug.Assert(yTop == 90 || yBot == -90);//we simply touch a pole
                    //continue
                }
            }

            //If there are no corners to check intersection because r wraps completely...
            if (r.GetWidth() == 360)
                return SpatialRelation.INTERSECTS;

            //Check corners:
            int cornersIntersect = NumCornersIntersect(r);
            // (It might be possible to reduce contains() calls within nCI() to exactly two, but this intersection
            //  code is complicated enough as it is.)
            double frontX = GetCenter().GetX();
            if (cornersIntersect == 4)
            {//all
                double backX = frontX <= 0 ? frontX + 180 : frontX - 180;
                if (r.RelateXRange(backX, backX).Intersects())
                    return SpatialRelation.INTERSECTS;
                else
                    return SpatialRelation.CONTAINS;
            }
            else if (cornersIntersect == 0)
            {//none
                if (r.RelateXRange(frontX, frontX).Intersects())
                    return SpatialRelation.INTERSECTS;
                else
                    return SpatialRelation.DISJOINT;
            }
            else//partial
                return SpatialRelation.INTERSECTS;
        }