#ifndef ASTAR_H #define ASTAR_H #include #include #include #include #include #include #include #include "../../grid/Grid.h" template class AStar { public: //dijkstra with priority queue O(E log V) template static std::vector get(const T* source, const T* destination, Access acc) { // track distances from the source to each other node std::unordered_map distance; // track the previous node for each node along the path std::unordered_map parent; // all nodes const std::vector& nodes = acc.getAllNodes(); // priority queue to check which node is to-be-processed next std::priority_queue, std::vector>, Comparator2> Q; // start with infinite distance for(const auto& node : nodes){ distance[&node] = std::numeric_limits::max(); } // start at the source distance[source] = 0.0f; Q.push(std::make_pair(source,distance[source])); // proceed until there are now new nodes to follow while(!Q.empty()) { // fetch the next-nearest node from the queue const T* u = Q.top().first; // and check whether we reached the destination if (u == destination) {break;} // remove from the Queue Q.pop(); // process all neighbors for the current element for( const T& v : acc.getNeighbors(*u)) { // weight (distance) between the current node and its neighbor //const float w = ((Point3)v - (Point3)*u).length(); const float w = acc.getWeightBetween(v, *u); // found a better route? if (distance[&v] > distance[u] + w) { distance[&v] = distance[u] + w; parent[&v] = u; Q.push(std::make_pair(&v, distance[&v] + acc.getHeuristic(v, *source))); } } } // construct the path std::vector path; const T* p = destination; path.push_back(destination); // until we reached the source-node while (p!=source) { if (p) { p = parent[p]; path.push_back(p); } else { return std::vector(); //if no path could be found, just return an empty vector. } } // done return path; } // template static std::vector getShortestPathAStar(const T* src, const T* dst, Access acc){ // std::vector shortestPath; // //here we could do some preprocessing. e.g. area of interest of nodes // // call aStar // shortestPath = aStar(src, dst, acc); // return shortestPath; // } class Comparator2 { public: int operator() ( const std::pair& p1, const std::pair& p2){ return p1.second > p2.second; } }; }; #endif // ASTAR_H