[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>(); }
[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>(); }