Exemple #1
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);
            }
        }
Exemple #2
0
        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);
            }
        }