private void ButtonSolveClick(object sender, RoutedEventArgs e) { if (_currentPolyLine.Points.Count >= 2) { _currentPolyLine.Points.Add(_currentPolyLine.Points[0]); } var initialState = new PathFindingState(new Search.Types.Point(100, 100)); var goalState = new PathFindingState(new Search.Types.Point(800, 600)); var environment = new PathFindingEnvironment(); foreach (var polyLine in _polyLines) { var points = polyLine.Points.Select(p => p).Distinct().ToList(); for (int i = 0; i < points.Count; i++) { for (int j = i + 1; j < points.Count; j++) { if (i == j) { continue; } var pointLine = new PointLine( new Point(points[i].X, points[i].Y), new Point(points[j].X, points[j].Y)); environment.PointLines.Add(pointLine); } } } var actionFunction = new PathFindingActionFunction(environment, goalState); var resultFunction = new PathFindingResultFunction(); var goalTest = new PathFindingGoalTest(goalState); var stepCost = new PathFindingStepCost(); var searchAlgorithm = new GraphSearch <PathFindingState, PathFindingAction>(); var problem = new Problem <PathFindingState, PathFindingAction>(initialState, actionFunction, resultFunction, goalTest, stepCost); var solution = searchAlgorithm.Search(problem); for (int i = 1; i < solution.Count; i++) { AddLine( solution[i - 1].State.Point.X, solution[i - 1].State.Point.Y, solution[i].State.Point.X, solution[i].State.Point.Y); } }
public void GraphSearchPerformanceTest() { int graphSize = 1024; int iteration = 100; float density = 0.5f; PathGrid graph = new PathGrid(0, 0, graphSize, graphSize, graphSize, graphSize); var picks = new int[graphSize * graphSize]; for (int i = 0; i < picks.Length; ++i) { picks[i] = i; } Random random = new Random(0); int obstacleCount = (int)(density * graphSize * graphSize); while (obstacleCount > 0) { var i = random.Next(obstacleCount); graph.Mark(picks[i] % graphSize, picks[i] / graphSize); obstacleCount--; picks[i] = picks[obstacleCount]; } int walkables = picks.Length - obstacleCount; GraphSearch search = new GraphSearch(); List <int> result = new List <int>(); int[] array = new int[graphSize * graphSize]; GC.Collect(); Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < iteration; ++i) { result.Clear(); search.Search(graph, picks[random.Next(walkables)], picks[random.Next(walkables)], result); } watch.Stop(); Trace.WriteLine("Max searches per frame (60 FPS): " + iteration / watch.Elapsed.TotalSeconds / 60.0); }
private void ButtonSolveClick(object sender, RoutedEventArgs e) { if (_currentPolyLine.Points.Count >= 2) { _currentPolyLine.Points.Add(_currentPolyLine.Points[0]); } var initialState = new PathFindingState(new Search.Types.Point(100, 100)); var goalState = new PathFindingState(new Search.Types.Point(800, 600)); var environment = new PathFindingEnvironment(); foreach (var polyLine in _polyLines) { var points = polyLine.Points.Select(p => p).Distinct().ToList(); for (int i = 0; i < points.Count; i++) { for (int j = i + 1; j < points.Count; j++) { if (i == j) continue; var pointLine = new PointLine( new Point(points[i].X, points[i].Y), new Point(points[j].X, points[j].Y)); environment.PointLines.Add(pointLine); } } } var actionFunction = new PathFindingActionFunction(environment, goalState); var resultFunction = new PathFindingResultFunction(); var goalTest = new PathFindingGoalTest(goalState); var stepCost = new PathFindingStepCost(); var searchAlgorithm = new GraphSearch<PathFindingState, PathFindingAction>(); var problem = new Problem<PathFindingState, PathFindingAction>(initialState, actionFunction, resultFunction, goalTest, stepCost); var solution = searchAlgorithm.Search(problem); for (int i = 1; i < solution.Count; i++) { AddLine( solution[i - 1].State.Point.X, solution[i - 1].State.Point.Y, solution[i].State.Point.X, solution[i].State.Point.Y); } }