読み始める前に、私の問題を理解するのを助けるために、このリンクからコードをコピーしたことを伝えます: 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;
}
}
}
しかし、これはクラッシュするだけです..