2012-04-11 2 views
1

Перед тем, как начать читать, чтобы помочь вам понять мою проблему, я говорю, что я скопировал код по этой ссылке: Dijkstra Shortest Path with VertexList = ListS in boost graphBoost :: Dijkstra Самый короткий путь, как получить индекс вершины из итератора пути?

Так .. Я переписывание моего программного кода, чтобы использовать импульс, но теперь, когда 99% Я застрял с моим GPS (для игры). У меня есть список узлов, которые я добавил так, что, к счастью, легко было преобразовать в метод boost. То, что я должен был сделать было просто создать переменную Vertice так:

Vertex Vx[MAX_NODES]; 

я скопировал из определений типов ссылке, которую я дал.

Путь добавляю вершины заключается в следующем:

  stringstream s; 
      s << i; 
      Vx[i] = add_vertex(s.str(),dgraph); 

Где «я» равно целое число. (например, int i = 9)

И эры также легко добавить. Теперь у меня есть собственный структурированный массив, называемый «xNode». и, например: xNode [i] содержит всю информацию для X Y Z позиций (xNode [i] .X xNode [i] .Y и т. д.) узлов.

Теперь при использовании кода со ссылкой я это сделал:

// Write shortest path 
std::cout << "Shortest path from " << startid << " to " << endid << ":" << std::endl; 
float totalDistance = 0; 
for(PathType::reverse_iterator pathIterator = path.rbegin(); pathIterator !=  path.rend(); ++pathIterator) 
{ 
    std::cout << source(*pathIterator, dgraph) << " -> " <<  target(*pathIterator, dgraph) 
    << " = " << get(boost::edge_weight, dgraph, *pathIterator) <<  std::endl; 
} 

И это где я застрял, как «источник (* pathIterator, dgraph)» и «мишени (* pathIterator, dgraph) «Получите адреса, но мне нужны индексы вершин для доступа к xNode [i], i - это NodeID (или, вернее, идентификатор вершины | Vx [i]). Как я могу это сделать?


EDIT: я пытался сделать:

for(PathType::reverse_iterator pathIterator = path.rbegin(); pathIterator !=  path.rend(); ++pathIterator) 
{ 
    for(int i = 0; i < MAX_NODES; ++i) 
    { 
     if(source(*pathIterator, dgraph) == *((Vertex*)Vx[i])) 
     { 
      cout << " " << i << " " << endl; 
      break; 
     } 
    } 
} 

, но это просто падает ..

ответ

3

С typedef с от этого вопроса, вы можете использовать get(boost::vertex_index, dgraph, v), чтобы получить индекс v , Кроме того, можно кэшировать карту с помощью свойства:

IndexMap vi = get(boost::vertex_index, dgraph); 

затем использовать get(vi, v), чтобы получить индекс для v.

+0

Спасибо, наконец, я получил (vi, source (* pathIterator, dgraph)), и это отлично работает! –