public object Clone() { PathOpen newPath = (PathOpen)this.MemberwiseClone(); newPath.waypoints = new List <Road>(this.waypoints); return(newPath); }
public static List <PathOpen> BranchPath(PathOpen root, int maxDist) { List <PathOpen> pathBranches = new List <PathOpen>(); Map.Direction[] directions = (Map.Direction[])Enum.GetValues(typeof(Map.Direction)); foreach (Map.Direction dir in directions) { bool isBackwardMove; if (root.waypoints.Count - 2 >= 0) { isBackwardMove = root.waypoints.Last().GetIntersectionLink(dir) == root.waypoints[root.waypoints.Count - 2]; } else { isBackwardMove = false; } if (root.waypoints.Last().GetIntersectionLink(dir) != null && !isBackwardMove) { PathOpen newPath = (PathOpen)root.Clone(); int addDist = root.waypoints.Last().GetLinkDistance(dir); newPath.distActualWorking += addDist; newPath.waypoints.Add(root.waypoints.Last().GetIntersectionLink(dir)); pathBranches.Add(newPath); } } return(pathBranches); }
public static Path FinalizePathOpen(PathOpen pathOpen) { Path finalizedPath = new Path(); finalizedPath.waypoints = pathOpen.waypoints; int finalDist = pathOpen.GetDistWorkingTotal(); finalizedPath.distActual = finalDist; finalizedPath.waypoints.Add(pathOpen.destination); return(finalizedPath); }
public static Path FindPath(Road source, Road dest) { List <PathOpen> openPaths = new List <PathOpen>(); int shortestDistFound = Map.mapHeight * Map.mapWidth; Path shortestPathFound = new Path(); PathOpen initialPath = new PathOpen(source, dest); openPaths.Add(initialPath); while (openPaths.Count > 0) { PathOpen workingPath = openPaths[0]; openPaths.RemoveAt(0); // Checks if the working path is on the same street as the destination. if (AreSameStreet(workingPath.waypoints.Last(), dest)) { // If it's on the same street finalize the working path Path finalizedPath = FinalizePathOpen(workingPath); // Check if the newly finialized path is shorter than the shortest found. if (finalizedPath.distActual < shortestDistFound) { // Then Update the shortest path. shortestPathFound = finalizedPath; shortestDistFound = finalizedPath.distActual; openPaths = CullOpenPaths(openPaths, shortestDistFound); } } else { List <PathOpen> branchedPath = BranchPath(workingPath, shortestDistFound); openPaths.AddRange(branchedPath); openPaths = CullOpenPaths(openPaths, shortestDistFound); openPaths.OrderBy(x => x.GetDistWorkingTotal()).ToList(); } } return(shortestPathFound); }