Я работаю над проектом SFML / C ++ и у меня есть некоторые проблемы с библиотекой графов наддува, в частности с astar_search. Я сгенерировал диаграмму Вороного для случайной карты и графика, чтобы использовать астарный метод библиотеки графов ускорения с серединой каждого центра многоугольников.
Установление краев:
for (Polygon *u : this->_map->_polygons)
{
if (u->getPolygonType() == u->GROUND)
{
WayPointID wpID = boost::add_vertex(graphe);
graphe[wpID].pos = u->getCenter();
for (std::deque<Edge_ *>::iterator it = u->getEdges().begin() ; it != u->getEdges().end() ; ++it)
{
std::pair<Polygon *, Polygon *> t = (*it)->_polygonsOwn;
WayPointID wpID2 = boost::add_vertex(graphe);
graphe[wpID2].pos = t.second->getCenter();
if (t.first->getPolygonType() == t.first->GROUND)
{
float dx = abs(graphe[wpID].pos.first - graphe[wpID2].pos.first);
float dy = abs(graphe[wpID].pos.second - graphe[wpID2].pos.second);
boost::add_edge(wpID, wpID2, WayPointConnection(sqrt(dx * dx + dy * dy)), graphe);
}
Края правильно установлены, когда я хочу нарисовать их:
Поэтому мне нужно использовать Astar Search с этими краями, но мой код не работает 🙁
struct found_goal {};
class astar_goal_visitor : public boost::default_astar_visitor{
private:
typedef boost::adjacency_list<
boost::listS,
boost::vecS,
boost::undirectedS,
WayPoint,
WayPointConnection
> WayPointGraph;
typedef WayPointGraph::vertex_descriptor WayPointID;
typedef WayPointGraph::edge_descriptor WayPointConnectionID;
WayPointGraph graphe;
WayPointID m_goal;
public:
astar_goal_visitor(WayPointID goal) : m_goal(goal) {}
void examine_vertex(WayPointID u, const WayPointGraph &){
if(u == m_goal)
throw found_goal();
}
};
И реализация:
boost::mt19937 gen(time(0));
std::vector<WayPointID> p(boost::num_vertices(graphe));
std::vector<float> d(boost::num_vertices(graphe));
WayPointID start = boost::random_vertex(graphe, gen);
WayPointID goal = boost::random_vertex(graphe, gen);
try {
boost::astar_search
(
graphe,
start,
boost::astar_heuristic<WayPointGraph, float>(),
boost::predecessor_map(&p[0]).distance_map(&d[0]).visitor(astar_goal_visitor(goal)).weight_map(boost::get(&WayPointConnection::dist, graphe))
);
} catch(found_goal fg) {
std::cout << "is ok" << std::endl;
}
Путь не найден … Если вы можете помочь мне с реализацией Astar, я буду признателен:) /
Я прошу прощения за длину этого поста :(, boost astar требует много реализации кода.
заранее спасибо
Вы вставляете слишком много вершин. Вы должны держать, скажем, unordred_map<Polygon*,vertex_descriptor>
, Перед вызовом add_vertex для данного многоугольника P вы должны сначала проверить, присутствует ли P на карте. Если да, используйте vertex_descriptor, соответствующий P, не вызывайте add_vertex. В противном случае вызовите v = add_vertex и добавьте пару (P, v) на карту.
Удачи!
Других решений пока нет …