Beispiel #1
0
        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);
        }
Beispiel #2
0
        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));
        }
Beispiel #3
0
        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());
        }
Beispiel #4
0
        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);
                        }
                    }
                }
            }
        }
Beispiel #5
0
        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));
        }
Beispiel #6
0
 private static bool IsCurrentLocationTheEndPoint(Entities.GridLocation currentLocation, Entities.GridLocation endPoint)
 {
     return((currentLocation.X == endPoint.X) && (currentLocation.Y == endPoint.Y));
 }