2012-02-07 10 views
5

Widzę przykłady tego przy użyciu map właściwości, ale nie przy użyciu struktur do obsługi wierzchołków i krawędzi (myślę, że nazywa się to "pakietami").Jak wydrukować wykres zwiększenia w graphviz przy jednej z wyświetlonych właściwości?

Mam wierzchołki i krawędzie zdefiniowane jako takie, na wykresie listy przyległości.

struct Vertex 
{ 
    string name; 
    int some_int; 
}; 

struct Edge 
{ 
    double weight; 
}; 

Wykres jest skonstruowany w następujący sposób:

typedef boost::adjacency_list<boost::listS, boost::vecS, boost::directedS, Vertex, Edge> boost_graph; 

chcę wydrukować mój wykres tych obiektów w formacie Graphviz, więc można go zobaczyć jako obraz. Jednak nie chcę tylko węzłów i krawędzi. Chcę również atrybut name na wierzchołkach i weight, aby krawędzie pojawiły się na obrazie. Jak mogę to zrobić?

+0

Myślę, że powinieneś pokazać pełną próbkę. Nie widzę, jak zbudowałeś drzewo z "zdefiniowanym" Edge'em. Być może zmapowana właściwość dla krawędzi? – sehe

+0

@sehe Dzięki. Dodałem definicję wykresu do pytania. Krawędzie i wierzchołki są dodawane przez funkcje boost :: add_edge i boost :: add_vertex – Jim

+0

Czy szukasz definicji formatu punktu? http://www.graphviz.org/Gallery.php wystarczy kliknąć dowolny z przykładów i zobaczyć kod potrzebny do ich wykonania :-) –

Odpowiedz

6

Po raz pierwszy podałem złe informacje. Oto poprawna odpowiedź.

#include <boost/graph/graphviz.hpp> 

using namespace boost; 

// Graph type 
typedef adjacency_list<vecS, vecS, directedS, VertexProperties, EdgeProperty> Graph; 
Graph g; 
std::vector<std::string> NameVec; // for dot file names 


// write the dot file 
std::ofstream dotfile (strDotFile.c_str()); 
write_graphviz (dotfile, g, make_label_writer(&NameVec[0])); 
+0

Dzięki, ale nie widzę metody o nazwie WriteDOTFile .. Gdzie to jest? – Jim

+0

@MartinKristiansen Tak, ale to nie wyjaśnia, gdzie jest funkcja .WriteDOTFile? Nie jestem pewien, co sugerujesz. – Jim

+0

Dzięki za aktualizację. Czy make_label_writer w jakiś sposób wybiera ciąg znaków z Vertex struct? – Jim

21

Po prostu natknąłem się na to pytanie. Chociaż ma akceptowaną odpowiedź, pomyślałem, że dodam też moją wersję.

Na swoim wykresie używasz bundled property. Prawidłowy sposób uzyskania mapy właściwości z powiązanych nieruchomości to użycie boost::get. Więc można zrobić coś takiego:

boost::write_graphviz(std::cout, your_graph, 
    boost::make_label_writer(boost::get(&Vertex::name, your_graph)), 
    boost::make_label_writer(boost::get(&Edge::weight, your_graph)), 
    ); 

Gdzie your_graph jest już utworzony obiekt wykresu.

+1

Zasługujesz na tyknięcie IMHO: D –

+0

@ ChrisHuang-Leaver , :-) dzięki. – Vikas

+0

Mam ten sam problem, ale zamiast publicznego atrybutu, mam metodę dla mojej klasy vertex, powiedz klasy Vertex {public: int getID(); private: int m_iID;}; Co powinienem zrobić w tym przypadku, aby umieścić identyfikator w pliku graphviz? – Jepessen

Powiązane problemy