2016-08-20 6 views
2

単純なグラフを表示するアプリケーションを作成しようとしています。基礎となるデータ構造にboost :: graphを使用しているので、ライブラリで利用可能なレイアウトアルゴリズムも使用したいと思います。ブーストグラフトポロジレイアウトの座標にどのようにアクセスしますか?

ここで紹介する答えは、グラフの頂点をレイアウトするために、ブーストライブラリ内のレイアウトアルゴリズムを使用する方法について説明します。 How does the attractive force of Fruchterman Reingold work with Boost Graph Library

しかし、悲しいことに、それはどのように説明していない - レイアウトした後に計算された - の座標を実際に頂点にアクセスすることができます。位置(またはポイント)のベクトルを取得しても、浮動小数点コンポーネントはプライベートなので、それは役に立ちません。 boost :: graphのドキュメントもこのトピックには触れていません。

レイアウトアルゴリズムが適用された後、どのようにして各頂点の単純(X、Y)座標を取得できますか?

答えて

2

ブーストグラフのソースコードを見てみると、結局のところそれほど難しくないことが判明しました。 我々はPositionsMap座標にアクセスするには、[]演算子を反復するためにプロパティマップを使用することができます。

template<typename Graph, typename Positions> 
void print_positions(const Graph &g, const Positions &positions) { 
    auto index_map = boost::get(boost::vertex_index, graph); 

    using PropertyMap = boost::iterator_property_map<Positions::iterator, decltype(index_map)>; 
    PropertyMap position_map(positions.begin(), index_map); 
    BGL_FORALL_VERTICES(v, graph, Graph) { 
     Position pos = position_map[v]; 
     cout << v << ": " << pos[0] << "|" << pos[1] << endl; 
    } 
} 
+0

こんにちは、あなたは、このコードの完全な例がありますか?私はこれを複製することができないので。 –

+0

@sdgawerzswer申し訳ありません、もはや - あなたの問題で新しい質問をすることができ、何が間違っているか把握できます。 –

+0

私は一方で、ポジションだけを使用するカスタムラッパーを書いています。基本的にpos [0]とpos [1]が個々のノードにマッピングされるループです。とにかくありがとうございます。 –

関連する問題