Ejemplo n.º 1
0
        public void GetJumpPoints_IntegrationTest_ThereIsNoPathToTarget_ReturnsTargetUnreachable()
        {
            /* Illustration:
             * .......
             ###....
             #s#t...
             ###....*/

            int unityGridXSize = 20;
            int unityGridYSize = 20;
            var startPosition  = new Position(1, 1);
            var targetPosition = new Position(3, 1);
            IRasterLineCreator    bresenham      = new BresenhamLineCreator();
            IOsnowaContextManager contextManager = CreateContextManager(unityGridXSize, unityGridYSize);

            contextManager.Current.PathfindingData.UpdateWalkability(new Position(0, 0), false);
            contextManager.Current.PathfindingData.UpdateWalkability(new Position(0, 1), false);
            contextManager.Current.PathfindingData.UpdateWalkability(new Position(0, 2), false);
            contextManager.Current.PathfindingData.UpdateWalkability(new Position(1, 0), false);
            contextManager.Current.PathfindingData.UpdateWalkability(new Position(1, 2), false);
            contextManager.Current.PathfindingData.UpdateWalkability(new Position(2, 0), false);
            contextManager.Current.PathfindingData.UpdateWalkability(new Position(2, 1), false);
            contextManager.Current.PathfindingData.UpdateWalkability(new Position(2, 2), false);
            var pathfinder = new Pathfinder(contextManager, new NaturalLineCalculator(bresenham), bresenham);

            PathfindingResponse jpsResult = pathfinder.FindJumpPointsWithJps(startPosition, targetPosition);

            jpsResult.Result.Should().Be(PathfindingResult.FailureTargetUnreachable);
            jpsResult.Positions.Should().BeNull();

            PathfindingResponse aStarResult = pathfinder.FindJumpPointsWithSpatialAstar(startPosition, targetPosition);

            aStarResult.Result.Should().Be(PathfindingResult.FailureTargetUnreachable);
            aStarResult.Positions.Should().BeNull();
        }
Ejemplo n.º 2
0
        public void GetJumpPoints_TargetNotInBounds_ReturnsTargetUnreachable()
        {
            /* Illustration:
             *
             * ...... t
             * s.....
             *
             */

            int unityGridXSize           = 6;
            int unityGridYSize           = 2;
            var startPosition            = new Position(0, 0);
            var targetPosition           = new Position(7, 1);
            IRasterLineCreator bresenham = new BresenhamLineCreator();
            var pathfinder = new Pathfinder(CreateContextManager(unityGridXSize, unityGridYSize), new NaturalLineCalculator(bresenham), bresenham);

            PathfindingResponse jpsResult = pathfinder.FindJumpPointsWithJps(startPosition, targetPosition);

            jpsResult.Result.Should().Be(PathfindingResult.FailureTargetUnreachable);
            jpsResult.Positions.Should().BeNull();

            PathfindingResponse aStarResult = pathfinder.FindJumpPointsWithSpatialAstar(startPosition, targetPosition);

            aStarResult.Result.Should().Be(PathfindingResult.FailureTargetUnreachable);
            aStarResult.Positions.Should().BeNull();
        }
Ejemplo n.º 3
0
        public virtual NavigationData GetNavigationData(Position startPosition, Position targetPosition)
        {
            if (!_grid.IsWalkable(targetPosition))
            {
                return(null);
            }

            var navigationData = new NavigationData
            {
                Destination = targetPosition,
                RemainingStepsInCurrentSegment = new Stack <Position>(),
                LastStep = startPosition
            };

            if (startPosition == targetPosition)
            {
                return(navigationData);
            }

            IList <Position> line = _rasterLineCreator.GetRasterLinePermissive(startPosition.x, startPosition.y, targetPosition.x,
                                                                               targetPosition.y, _grid.IsWalkable);

            bool rasterLineReachesTarget = line.Last() == targetPosition;

            if (rasterLineReachesTarget)
            {
                _debugPathPresenter.PresentStraight(line);
                // performance: if GetRasterLinePermissive returned a stack, we wouldn't need to allocate memory for the list
                navigationData.RemainingNodes = new[] { targetPosition }.ToList();
                return(navigationData);
            }

            PathfindingResponse result = _pathfinder.FindJumpPointsWithJps(startPosition, targetPosition);

            if (result.Result != PathfindingResult.Success)
            {
                return(null);
            }
            IEnumerable <Position> naturalJumpPoints = _naturalLineCreator.GetNaturalJumpPoints(result.Positions).Skip(1);

            navigationData.RemainingNodes = naturalJumpPoints.ToList();
            _debugPathPresenter.PresentNonStraight(navigationData.RemainingNodes);

            return(navigationData);
        }
Ejemplo n.º 4
0
        public List <Position> GetJumpPoints(Position startPosition, Position targetPosition)
        {
            var stopwatch = Stopwatch.StartNew();

            PathfindingResponse result = _pathfinder.FindJumpPointsWithJps(startPosition, targetPosition);

            if (result.Result != PathfindingResult.Success)
            {
                return(null);
            }
            List <Position> jumpPointsToTarget = result.Positions.Skip(1).ToList();

            string logEntry = String.Format("Path from {0} to {1}: {2} steps, {3} ms.",
                                            startPosition, targetPosition, jumpPointsToTarget.Count, stopwatch.ElapsedMilliseconds);

            //_uiFacade.AddLogEntry(logEntry);

            return(jumpPointsToTarget);
        }