public Entities.Path FindPath(Entities.Grid grid, Entities.GridLocation startPoint, Entities.GridLocation endPoint) { var result = new ShortestPath.Optimization.Entities.Path(); var currentLocation = result.Add(grid[startPoint.X, startPoint.Y]); currentLocation.DistanceFromStart = 0; while (!IsCurrentLocationTheEndPoint(currentLocation, endPoint)) { var moveX = _random.Next(3) - 1; var moveY = _random.Next(3) - 1; if (moveX != 0 || moveY != 0) { var newX = currentLocation.X + moveX; var newY = currentLocation.Y + moveY; if (grid.LocationIsTraversable(newX, newY)) { var newLocation = grid[newX, newY]; newLocation.DistanceFromStart = currentLocation.DistanceFromStart + 1; currentLocation = result.Add(newLocation); } } } return(result); }
public Entities.Path FindPath(Entities.Grid grid, Entities.GridLocation startPoint, Entities.GridLocation endPoint) { var startingLocation = grid[startPoint.X, startPoint.Y]; var endingLocation = grid[endPoint.X, endPoint.Y]; ProcessLocation(0, grid, startingLocation, endingLocation); return(RetraceSteps(grid, endPoint)); }
private Entities.Path RetraceSteps(Entities.Grid grid, Entities.GridLocation endPoint) { var resultPath = new Entities.Path(); var currentLocation = grid[endPoint.X, endPoint.Y]; resultPath.Add(currentLocation); var pathLength = currentLocation.DistanceFromStart.Value; for (int i = pathLength - 1; i >= 0; i--) { currentLocation = grid.LocationsAtDistance(i).SurroundingLocation(currentLocation).First(); resultPath.Add(currentLocation); } return(resultPath.Reverse()); }
private void ProcessLocation(int currentDistance, Entities.Grid grid, Entities.GridLocation startPoint, Entities.GridLocation endPoint) { var currentPoint = startPoint; if (!currentPoint.DistanceFromStart.HasValue || currentPoint.DistanceFromStart.Value > currentDistance) { currentPoint.DistanceFromStart = currentDistance; for (int xDelta = -1; xDelta < 2; xDelta++) { for (int yDelta = -1; yDelta < 2; yDelta++) { var newLocation = grid.TraversableLocationAtOffset(currentPoint, xDelta, yDelta); if (newLocation != null) { ProcessLocation(currentDistance + 1, grid, newLocation, endPoint); } } } } }
public static IEnumerable <Entities.GridLocation> SurroundingLocation(this IEnumerable <Entities.GridLocation> locations, Entities.GridLocation centerPoint) { var minX = centerPoint.X - 1; var maxX = centerPoint.X + 1; var minY = centerPoint.Y - 1; var maxY = centerPoint.Y + 1; return(locations.Where(l => l.X >= minX && l.X <= maxX && l.Y >= minY && l.Y <= maxY)); }
private static bool IsCurrentLocationTheEndPoint(Entities.GridLocation currentLocation, Entities.GridLocation endPoint) { return((currentLocation.X == endPoint.X) && (currentLocation.Y == endPoint.Y)); }