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