Esempio n. 1
0
        public ParsedImgs ParsePanelImage(SoftwareBitmap SourceBitmap)
        {
            if (Enable)
            {
                ParsedImgs      parsedImgs     = new ParsedImgs();
                List <PadPanel> AnalyzedPanels = new List <PadPanel>();
                //Parallel.ForEach(Filter.AllFilter, (filter) =>
                foreach (var filter in Filter.AllFilter)
                {
                    PadPanel p = filter.FiltePanel(SourceBitmap, out SoftwareBitmap filterBitmap);

                    AnalyzedPanels.Add(p);
                    parsedImgs.AddResult(filter.BeadType, filterBitmap);
                }
                //);

                lock (panelVoter)
                {
                    foreach (var p in AnalyzedPanels)
                    {
                        panelVoter.Add(p);
                    }
                }

                return(parsedImgs);
            }

            return(null);
        }
Esempio n. 2
0
        private async Task DoParseRoute()
        {
            var ParsedPanel = PanelParser.GetParsedPanel();

            if (ParsedPanel != null && ParsedPanel.IsValid())
            {
                MessageSB.AppendLine("Solving route.....");
                DateTime dt = DateTime.Now;

                PadPanel FinalPanel = null;

                await Task.Factory.StartNew(() =>
                {
                    ParsedRoute = PuzzleSolver.SolvePuzzleLoop(ParsedPanel, 40, TargetRouteScore);
                    FinalPanel  = ParsedPanel.ApplyRoute(ParsedRoute);
                });

                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
                    ResultPanelTextBlock.Text = FinalPanel.ToString();
                    RouteTextBox.Text         = ParsedRoute.ToString();
                });

                int timems = (int)(DateTime.Now - dt).TotalMilliseconds;
                MessageSB.Append("Score:");
                MessageSB.Append(ParsedRoute.Score);
                MessageSB.Append(",len:");
                MessageSB.AppendLine(ParsedRoute.Length.ToString());
                MessageSB.Append("Finish in ");
                MessageSB.Append(timems.ToString());
                MessageSB.AppendLine(" ms");
            }
        }
Esempio n. 3
0
 public void Add(PadPanel panel)
 {
     for (int x = 0; x < PadPanel.Width; x++)
     {
         for (int y = 0; y < PadPanel.Height; y++)
         {
             BeadVotings[x, y].Add(panel.beads[x, y]);
         }
     }
 }
Esempio n. 4
0
        public PadPanel GetPanel()
        {
            PadPanel p = new PadPanel();

            for (int x = 0; x < PadPanel.Width; x++)
            {
                for (int y = 0; y < PadPanel.Height; y++)
                {
                    p.beads[x, y] = BeadVotings[x, y].GetBead();
                }
            }

            return(p);
        }
Esempio n. 5
0
        public PadPanel FiltePanel(SoftwareBitmap input, out SoftwareBitmap output)
        {
            output = new SoftwareBitmap(BitmapPixelFormat.Bgra8, input.PixelWidth, input.PixelHeight, BitmapAlphaMode.Premultiplied);

            List <Point> BeadLocations = new List <Point>();

            _cvhelper.ParsePanelByHsv(input, output, HsvRanges, PadPanel.size, BeadLocations);

            PadPanel p = new PadPanel();

            foreach (var point in BeadLocations)
            {
                p.beads[(int)point.X, (int)point.Y] = BeadType;
            }

            return(p);
        }
Esempio n. 6
0
        public static Route SolvePuzzle(PadPanel padPanel, int aheads, int lenLimit, int beamWeight, int TargetScore, bool DeepMode = false)
        {
            List <Route> Routes      = new List <Route>();
            Route        TargetRoute = null;

            var v = Parallel.For(0, PadPanel.Height, (y, state) =>
            {
                for (int x = 0; x < PadPanel.Width; x++)
                {
                    PuzzDraBeamParser puzzDraSolver = new PuzzDraBeamParser();
                    puzzDraSolver.InitSearchData(aheads);

                    int[] outRouteArr = new int[lenLimit];
                    Point StartPoint  = new Point(x, y);

                    int Score = 0;
                    if (DeepMode)
                    {
                        puzzDraSolver.BeamSearch(padPanel.ToBoardArr(), StartPoint, aheads, lenLimit, beamWeight, outRouteArr, out Score);
                    }
                    else
                    {
                        puzzDraSolver.FirstSearch(padPanel.ToBoardArr(), StartPoint, aheads, lenLimit, beamWeight, outRouteArr, out Score);
                    }

                    Route r = new Route(outRouteArr, StartPoint, Score);

                    lock (Routes)
                        Routes.Add(r);

                    if (r.Score >= TargetScore)
                    {
                        TargetRoute = r;
                        state.Break();
                    }
                }
            });

            return(TargetRoute ?? Routes.OrderByDescending(r => r.Score).First());
        }
Esempio n. 7
0
        public static Route SolvePuzzleLoop(PadPanel padPanel, int lenLimit, int TargetScore)
        {
            Route route = null;

            for (int ahead = 1; ahead < MaxLookAhead; ahead++)
            {
                //route = SolvePuzzle(padPanel, ahead, lenLimit, ahead,TargetScore, false);
                //if (route.Score >= TargetScore)
                //{
                //    route.Message = "Ahead=" + ahead + ",Deep mode=false";
                //    break;
                //}

                route = SolvePuzzle(padPanel, ahead, lenLimit, ahead, TargetScore, true);
                if (route.Score >= TargetScore)
                {
                    route.Message = "Ahead=" + ahead + ",Deep mode=true";
                    break;
                }
            }
            return(route);
        }