public void ConstructAllImplied()
        {
            //
            // Calculate all the important points of intersection among shapes (as well as Circle-Circle intersections).
            //
            ShapeIntersectionCalculator shapeIntCalc = new ShapeIntersectionCalculator(this);
            List<CircleCircleIntersection> tempCCInter = new List<CircleCircleIntersection>();
            shapeIntCalc.CalcCircleCircleIntersections(out tempCCInter);
            ccIntersections = tempCCInter;

            //
            // Generate ALL segment clauses
            //
            // Have we done this before? Hard-coded provides collinear relationships.
            CalculateCollinear();
            GenerateSegmentClauses();

            // Acquire all of the unlabeled points from the UI drawing.
            DrawingPointCalculator unlabeledCalc = new DrawingPointCalculator(points, segments, circles);
            unlabeledPoints = unlabeledCalc.GetUnlabeledPoints();

            // Add the implied points to the complete list of points.
            allFigurePoints.AddRange(unlabeledPoints);

            // Using only segments, identify all polygons which are implied.
            PolygonCalculator polyCalc = new PolygonCalculator(segments);
            polygons = polyCalc.GetPolygons();

            shapeIntCalc.CalcCirclePolygonIntersectionPoints();
            shapeIntCalc.CalcPolygonPolygonIntersectionPoints();

            // Determine what shapes are contained within what other shapes.
            ShapeContainmentCalculator shapeContainCalc = new ShapeContainmentCalculator(this);
            shapeContainCalc.CalcCircleCircleContainment();
            shapeContainCalc.CalcCirclePolygonContainment();
            shapeContainCalc.CalcPolygonPolygonContainment();

            // Calculate all (selective) Segment-Segment Intersections
            CalculateIntersections();

            // Find all circle-segment intersection points.
            // Segments (which are not part of a polygon) may intersect a circle; these are also added to the circle's interesting points.
            csIntersections = shapeIntCalc.FindCircleSegmentIntersections();

            // Find all the angles based on intersections; duplicates are removed.
            CalculateAngles();

            // Identify inscribed and circumscribed situations between a circle and polygon.
            AnalyzeCirclePolygonInscription();

            // Determine which of the UI and implied (intersection) points apply to each circle.
            // Generates all arc clauses and arcInMiddle clauses.
            AnalyzeAllCirclePointRelationships();

            //
            // All of the following calculations are used in stating the assumptions (user-defined givens)
            //
            CalculateSegmentBisectors();
            CalculateAngleBisectors();

            // Define in Properties->Build->Compilation Symbols to turn off this section
            #if !ATOMIC_REGION_OFF

            List<Sector> localMinorSectors = null;
            List<Sector> localMajorSectors = null;
            List<Semicircle> localSemicircles = null;
            foreach (Circle circle in circles)
            {
                circle.ConstructImpliedAreaBasedSectors(out localMinorSectors, out localMajorSectors, out localSemicircles);
            }

            //
            // Atomic region identification
            //
            atomicRegions = AtomicRegionIdentifier.AtomicIdentifierMain.GetAtomicRegions(allFigurePoints, circles, polygons);

            //
            // This is to ensure that we actually construct all the polygonalized versions of all the atomic regions.
            //
            foreach (AtomicRegion atom in atomicRegions)
            {
                Polygon poly = atom.GetPolygonalized();

                if (Utilities.CONSTRUCTION_DEBUG)
                {
                    Debug.WriteLine(poly);
                }
            }
            #endif
            // --- End timing ---
            stopwatch.Stop();
        }
        public void ConstructAllImplied()
        {
            //
            // Calculate all the important points of intersection among shapes (as well as Circle-Circle intersections).
            //
            ShapeIntersectionCalculator     shapeIntCalc = new ShapeIntersectionCalculator(this);
            List <CircleCircleIntersection> tempCCInter  = new List <CircleCircleIntersection>();

            shapeIntCalc.CalcCircleCircleIntersections(out tempCCInter);
            ccIntersections = tempCCInter;

            //
            // Generate ALL segment clauses
            //
            // Have we done this before? Hard-coded provides collinear relationships.
            CalculateCollinear();
            GenerateSegmentClauses();

            // Acquire all of the unlabeled points from the UI drawing.
            DrawingPointCalculator unlabeledCalc = new DrawingPointCalculator(points, segments, circles);

            unlabeledPoints = unlabeledCalc.GetUnlabeledPoints();

            // Add the implied points to the complete list of points.
            allFigurePoints.AddRange(unlabeledPoints);

            // Using only segments, identify all polygons which are implied.
            PolygonCalculator polyCalc = new PolygonCalculator(segments);

            polygons = polyCalc.GetPolygons();

            shapeIntCalc.CalcCirclePolygonIntersectionPoints();
            shapeIntCalc.CalcPolygonPolygonIntersectionPoints();

            // Determine what shapes are contained within what other shapes.
            ShapeContainmentCalculator shapeContainCalc = new ShapeContainmentCalculator(this);

            shapeContainCalc.CalcCircleCircleContainment();
            shapeContainCalc.CalcCirclePolygonContainment();
            shapeContainCalc.CalcPolygonPolygonContainment();

            // Calculate all (selective) Segment-Segment Intersections
            CalculateIntersections();

            // Find all circle-segment intersection points.
            // Segments (which are not part of a polygon) may intersect a circle; these are also added to the circle's interesting points.
            csIntersections = shapeIntCalc.FindCircleSegmentIntersections();

            // Find all the angles based on intersections; duplicates are removed.
            CalculateAngles();

            // Identify inscribed and circumscribed situations between a circle and polygon.
            AnalyzeCirclePolygonInscription();

            // Determine which of the UI and implied (intersection) points apply to each circle.
            // Generates all arc clauses and arcInMiddle clauses.
            AnalyzeAllCirclePointRelationships();

            //
            // All of the following calculations are used in stating the assumptions (user-defined givens)
            //
            CalculateSegmentBisectors();
            CalculateAngleBisectors();

// Define in Properties->Build->Compilation Symbols to turn off this section
#if !ATOMIC_REGION_OFF
            List <Sector>     localMinorSectors = null;
            List <Sector>     localMajorSectors = null;
            List <Semicircle> localSemicircles  = null;
            foreach (Circle circle in circles)
            {
                circle.ConstructImpliedAreaBasedSectors(out localMinorSectors, out localMajorSectors, out localSemicircles);
            }

            //
            // Atomic region identification
            //
            atomicRegions = AtomicRegionIdentifier.AtomicIdentifierMain.GetAtomicRegions(allFigurePoints, circles, polygons);

            //
            // This is to ensure that we actually construct all the polygonalized versions of all the atomic regions.
            //
            foreach (AtomicRegion atom in atomicRegions)
            {
                Polygon poly = atom.GetPolygonalized();

                if (Utilities.CONSTRUCTION_DEBUG)
                {
                    Debug.WriteLine(poly);
                }
            }
#endif
            // --- End timing ---
            stopwatch.Stop();
        }