using OSMDatastructure; using OSMDatastructure.Graph; using Utils = OSMDatastructure.Utils; namespace Pathfinding; public static partial class Pathfinder { public static List AStarTime(string workingDir, Coordinates start, Coordinates goal, Tag.SpeedType vehicle) { RegionManager regionManager = new (workingDir); ValueTuple startAndEndNode = SetupNodes(start, goal, regionManager); if (startAndEndNode.Item1 is null || startAndEndNode.Item2 is null) return new List(); OsmNode goalNode = startAndEndNode.Item2!; PriorityQueue toVisit = new(); toVisit.Enqueue(startAndEndNode.Item1, 0); bool stop = false; while (toVisit.Count > 0) { OsmNode closestNodeToGoal = toVisit.Dequeue(); foreach (OsmEdge edge in closestNodeToGoal.edges.Where( edge => regionManager.TestValidConnectionForType(closestNodeToGoal, edge, vehicle))) { OsmNode? neighbor = regionManager.GetNode(edge.neighborId, edge.neighborRegion); if (neighbor is not null) { double newPotentialWeight = closestNodeToGoal.currentPathWeight + EdgeWeight(closestNodeToGoal, edge, vehicle, regionManager); if (newPotentialWeight < neighbor.currentPathWeight) { neighbor.previousPathNode = closestNodeToGoal; neighbor.currentPathLength = closestNodeToGoal.currentPathLength + Utils.DistanceBetween(closestNodeToGoal, neighbor); neighbor.currentPathWeight = newPotentialWeight; neighbor.directDistanceToGoal = Utils.DistanceBetween(neighbor, goalNode); if (neighbor.Equals(goalNode)) { stop = true; } else if(!stop) { toVisit.Enqueue(neighbor, neighbor.directDistanceToGoal); } } } } } return GetRouteFromCalc(goalNode, regionManager); } }