private IntersectionResults BuildFinalResults(Polygon2 intersectedPolygon) {
                Contract.Requires(intersectedPolygon != null);
                Contract.Ensures(Contract.Result<IntersectionResults>() != null);
                Contract.Ensures(intersectedPolygon.Count >= Contract.OldValue(intersectedPolygon).Count);

                if (intersectedPolygon.Count == 0) {
                    var untouchedA = FindUntouchedRingsA();
                    var untouchedB = FindUntouchedRingsB();
                    intersectedPolygon.AddRange(QualifyRings(untouchedA, untouchedB, true));
                    intersectedPolygon.AddRange(QualifyRings(untouchedB, untouchedA, false));
                }
                else {
                    var intersectedResultTree = new RingBoundaryTree(intersectedPolygon);
                    intersectedPolygon.AddRange(
                        FilterQualifiedRingsToBoundaryTree(
                            QualifyRings(FindUntouchedRingsA(), B, true),
                            intersectedResultTree
                        )
                    );
                    intersectedPolygon.AddRange(
                        FilterQualifiedRingsToBoundaryTree(
                            QualifyRings(FindUntouchedRingsB(), A, false),
                            intersectedResultTree
                        )
                    );
                }
                return new IntersectionResults {
                    Polygon = intersectedPolygon
                };
            }
        private static List<Ring2> QualifyRings(
            Polygon2 untouchedRings,
            Polygon2 polygon,
            bool qualifyEqual
        ) {
            Contract.Requires(untouchedRings != null);
            Contract.Requires(polygon != null);
            Contract.Ensures(Contract.Result<List<Ring2>>() != null);
            Contract.Ensures(Contract.ForAll(Contract.Result<List<Ring2>>(), x => null != x));

            var result = new List<Ring2>();
            var ringTree = new RingBoundaryTree(polygon);
            foreach (var ring in untouchedRings) {
                Contract.Assume(ring != null);
                // TODO: speed this up through some kind of magic, like RingBoundaryTree or something
                // TODO: var eq = new SpatialEqualityComparerThing(ringA); var stuff = otherRings.Where(r = > eq.SpatiallyEqual(r));
                if (polygon.Any(r => ring.SpatiallyEqual(r))) {
                    if (qualifyEqual)
                        result.Add(ring.Clone());
                }
                else if (ringTree.NonIntersectingContains(ring))
                    result.Add(ring.Clone());
            }
            Contract.Assume(Contract.ForAll(result, x => null != x));
            return result;
        }
 private static IEnumerable<Ring2> FilterQualifiedRingsToBoundaryTree(List<Ring2> rings, RingBoundaryTree boundaryTree) {
     Contract.Requires(rings != null);
     Contract.Requires(boundaryTree != null);
     Contract.Ensures(Contract.Result<IEnumerable<Ring2>>() != null);
     Contract.Ensures(Contract.ForAll(Contract.Result<IEnumerable<Ring2>>(), x => x != null));
     return rings.Where(ring => ring.Hole.GetValueOrDefault() == boundaryTree.NonIntersectingContains(ring));
 }