1

読み始める前に、私の問題を理解するのを助けるために、このリンクからコードをコピーしたことを伝えます: Dijkstra Shortest Path with VertexList = ListS in boost graph

だから..ブーストを使用するようにプログラムコードを書き直していますが、99%の準備ができたとき、GPS(ゲーム用)で立ち往生しています。ノードのリストがあり、幸いなことに簡単にブースト メソッドに変換できるように追加しました。私がする必要があったのは、次のような頂点変数を作成することだけでした:

Vertex Vx[MAX_NODES];

指定したリンクから typedef をコピーしました。

頂点を追加する方法は次のとおりです。

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

ここで、「i」は整数です。(例: int i = 9)

また、エゲスも簡単に追加できます。これで、「xNode」と呼ばれる独自の構造化配列ができました。例: xNode[i] は、ノードの XYZ 位置 (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; 
} 

「source(*pathIterator, dgraph)」と「target(*pathIterator, dgraph)」はアドレスを取得しますが、xNode[i] にアクセスするには頂点インデックスが必要です。i は NodeID (または頂点 ID | Vx[i])。どうやってやるの?


編集:私はやろうとしました:

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;
        }
    }
} 

しかし、これはクラッシュするだけです..

4

1 に答える 1

3

そのtypedef質問の を使用get(boost::vertex_index, dgraph, v)して、 のインデックスを取得できますv。以下を使用して、プロパティ マップをキャッシュすることもできます。

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

get(vi, v)のインデックスを取得するために使用しますv

于 2012-04-11T17:30:36.720 に答える