コード例 #1
0
            [ContractVerification(false)] // TODO: remove when CC bugs are fixed
            public PolygonCrossingsAlgorithmKernel(Polygon2 a, Polygon2 b, List <PolygonCrossing> crossings)
            {
                Contract.Requires(a != null);
                Contract.Requires(b != null);
                Contract.Requires(crossings != null);
                Contract.Requires(Contract.ForAll(crossings, x => x != null));
                A = a;
                B = b;

                var ringCrossingsABuilder = new Dictionary <int, List <PolygonCrossing> >(a.Count);
                var ringCrossingsBBuilder = new Dictionary <int, List <PolygonCrossing> >(b.Count);

                foreach (var crossing in crossings)
                {
                    List <PolygonCrossing> list;
                    if (!ringCrossingsABuilder.TryGetValue(crossing.LocationA.RingIndex, out list))
                    {
                        list = new List <PolygonCrossing>();
                        ringCrossingsABuilder.Add(crossing.LocationA.RingIndex, list);
                    }
                    Contract.Assume(list != null);
                    list.Add(crossing);
                    Contract.Assume(crossing.LocationB != null);
                    if (!ringCrossingsBBuilder.TryGetValue(crossing.LocationB.RingIndex, out list))
                    {
                        Contract.Assume(crossing.LocationB != null);
                        list = new List <PolygonCrossing>();
                        ringCrossingsBBuilder.Add(crossing.LocationB.RingIndex, list);
                    }
                    Contract.Assume(list != null);
                    list.Add(crossing);
                }
                RingCrossingsA = PolygonRingCrossingLookup.Build(ringCrossingsABuilder, PolygonCrossing.LocationAComparer.CompareNonNull);
                RingCrossingsB = PolygonRingCrossingLookup.Build(ringCrossingsBBuilder, PolygonCrossing.LocationBComparer.CompareNonNull);

                Entrances                    = new HashSet <PolygonCrossing>();
                Exits                        = new HashSet <PolygonCrossing>();
                EntranceHops                 = new Dictionary <PolygonCrossing, PolygonCrossing>();
                ExitHops                     = new Dictionary <PolygonCrossing, PolygonCrossing>();
                VisitedCrossings             = new List <PolygonCrossing>();
                VisitedCrossingsRingIndicesA = new HashSet <int>();
                VisitedCrossingsRingIndicesB = new HashSet <int>();
            }
コード例 #2
0
            [ContractVerification(false)] // TODO: remove when CC bugs are fixed
            public PolygonCrossingsAlgorithmKernel(Polygon2 a, Polygon2 b, List<PolygonCrossing> crossings) {
                Contract.Requires(a != null);
                Contract.Requires(b != null);
                Contract.Requires(crossings != null);
                Contract.Requires(Contract.ForAll(crossings, x => x != null));
                A = a;
                B = b;

                var ringCrossingsABuilder = new Dictionary<int, List<PolygonCrossing>>(a.Count);
                var ringCrossingsBBuilder = new Dictionary<int, List<PolygonCrossing>>(b.Count);
                foreach (var crossing in crossings) {
                    List<PolygonCrossing> list;
                    if (!ringCrossingsABuilder.TryGetValue(crossing.LocationA.RingIndex, out list)) {
                        list = new List<PolygonCrossing>();
                        ringCrossingsABuilder.Add(crossing.LocationA.RingIndex, list);
                    }
                    Contract.Assume(list != null);
                    list.Add(crossing);
                    Contract.Assume(crossing.LocationB != null);
                    if (!ringCrossingsBBuilder.TryGetValue(crossing.LocationB.RingIndex, out list)) {
                        Contract.Assume(crossing.LocationB != null);
                        list = new List<PolygonCrossing>();
                        ringCrossingsBBuilder.Add(crossing.LocationB.RingIndex, list);
                    }
                    Contract.Assume(list != null);
                    list.Add(crossing);
                }
                RingCrossingsA = PolygonRingCrossingLookup.Build(ringCrossingsABuilder, PolygonCrossing.LocationAComparer.CompareNonNull);
                RingCrossingsB = PolygonRingCrossingLookup.Build(ringCrossingsBBuilder, PolygonCrossing.LocationBComparer.CompareNonNull);

                Entrances = new HashSet<PolygonCrossing>();
                Exits = new HashSet<PolygonCrossing>();
                EntranceHops = new Dictionary<PolygonCrossing, PolygonCrossing>();
                ExitHops = new Dictionary<PolygonCrossing, PolygonCrossing>();
                VisitedCrossings = new List<PolygonCrossing>();
                VisitedCrossingsRingIndicesA = new HashSet<int>();
                VisitedCrossingsRingIndicesB = new HashSet<int>();
            }