Exemple #1
0
        static PointProjectionSolver TryCycle(PointProjectionSolver solver, List <PPath> cycle)
        {
            var pr = new Projection(solver.Graph, solver.AllSegments, solver.SegmentFamilies, cycle[0].length, cycle[1].length);

            pr.Stages.Push(Projector.CreateInitialProjection(cycle, pr));

            //Console.WriteLine(string.Join(" ||| ", cycle));
            // Visualize(solver, pr, cycleCounter.ToString());


            var res = TryHordEdges(solver, pr);

            if (res != null)
            {
                return(res);
            }

            var squashes = Projector.FindSquashPoint(pr);

            foreach (var sq in squashes)
            {
                var o = TrySquashPoint(solver, pr, sq);
                if (o != null)
                {
                    return(o);
                }
            }
            return(null);
        }
Exemple #2
0
        static PointProjectionSolver TrySquashPoint(PointProjectionSolver solver, Projection pr, ProjectionStage stage)
        {
            pr.Stages.Push(stage);
            var res = TryHordEdges(solver, pr);

            if (res == null)
            {
                pr.Stages.Pop();
            }
            return(res);
        }
Exemple #3
0
        public static bool EvaluateProjection(PointProjectionSolver solver, Projection pr)
        {
            if (!pr.IsCompleteProjection())
            {
                return(false);
            }
            solver.ProjectionScheme = pr;
            solver.Projection       = GenerateOutGraph(solver.ProjectionScheme, false);
            var solution = SolutionSpecBuilder.BuildSolutionByGraph(solver.Projection);

            return(solution.AreFacetsValid(pr.SideY * pr.SideX));
        }
Exemple #4
0
        public static void Visualize(PointProjectionSolver solver, Projection p = null, string name = "")
        {
            if (p == null)
            {
                p = solver.ProjectionScheme;
            }
            var gr  = GenerateOutGraph(p, true);
            var viz = new GraphVisualizer <PointProjectionSolver.ProjectedEdgeInfo, PointProjectionSolver.ProjectedNodeInfo>();

            viz.GetX = z => z.Data.Projection.X;
            viz.GetY = z => z.Data.Projection.Y;
            // viz.NodeCaption = z => z.Data.Original.Data.Location.ToString();
            viz.Window(500, gr, name);
        }
Exemple #5
0
        public static PointProjectionSolver CreateSolver(ProblemSpec spec)
        {
            //            spec = spec.MoveToOrigin();

            var solver = new PointProjectionSolver {
                spec = spec
            };
            var r = Pathfinder.MakeSegmentsWithIntersections(spec.Segments);

            solver.vectors         = r.Item2;
            solver.SegmentFamilies = r.Item1;
            solver.AllSegments     = r.Item1.SelectMany(z => z.Segments).ToList();
            solver.Graph           = Pathfinder.BuildGraph(solver.AllSegments, solver.vectors);
            return(solver);
        }
Exemple #6
0
 static PointProjectionSolver TryHordEdges(PointProjectionSolver solver, Projection pr)
 {
     while (true)
     {
         //  Visualize(solver, pr);
         if (EvaluateProjection(solver, pr))
         {
             return(solver);
         }
         var hordEdgeStage = Projector.AddVeryGoodEdges(pr);
         if (hordEdgeStage != null)
         {
             pr.Stages.Push(hordEdgeStage);
             continue;
         }
         else
         {
             break;
         }
     }
     return(null);
 }
Exemple #7
0
        public static PointProjectionSolver Solve(PointProjectionSolver solver, Rational otherSide, double metricaBorder = 0, bool usePerimeterFinder = true)
        {
            IEnumerable <List <PPath> > cycles;

            if (usePerimeterFinder)
            {
                var pathLengths = new [] { 1, otherSide, 1, otherSide };
                var wayFinder   = new WayFinder(solver.Graph, pathLengths.Distinct().ToList());
                cycles = new PerimeterFinder(wayFinder, pathLengths).Find();
            }
            else
            {
                var originality = metricaBorder;
                var pathes      = Pathfinder.FindAllPathes(solver.Graph, 1, originality);
                var ps1         = pathes.ToList();

                var ps2 = otherSide == 1
                                ? ps1.ToList()
                                : Pathfinder.FindAllPathes(solver.Graph, otherSide, originality).ToList();

                cycles = Pathfinder.FindAllCycles(ps1, ps2);
            }

            //var cs = cycles.ToList();

            cycleCounter = -1;

            foreach (var c in cycles)
            {
                cycleCounter++;
                var res = TryCycle(solver, c);
                if (res != null)
                {
                    return(res);
                }
            }
            return(null);
        }