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