2012-02-07 30 views
5

Tôi thấy ví dụ về điều này khi sử dụng bản đồ thuộc tính, nhưng không phải khi sử dụng cấu trúc để xử lý các đỉnh và cạnh (tôi nghĩ đây được gọi là 'bó').Làm cách nào để in đồ thị tăng cường trong graphviz với một trong các thuộc tính được hiển thị?

Tôi có các đỉnh và cạnh được xác định như vậy, trong biểu đồ danh sách kề.

struct Vertex 
{ 
    string name; 
    int some_int; 
}; 

struct Edge 
{ 
    double weight; 
}; 

Đồ thị được xây dựng như sau:

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

Tôi muốn in đồ thị của tôi về các đối tượng trong định dạng Graphviz, vì vậy tôi có thể xem nó như là một hình ảnh. Tuy nhiên, tôi không chỉ muốn các nút và các cạnh. Tôi cũng muốn thuộc tính name trên đỉnh và weight trên các cạnh xuất hiện trong hình ảnh. Tôi có thể làm cái này như thế nào?

+0

Tôi nghĩ bạn nên hiển thị mẫu đầy đủ. Tôi không thể thấy cách bạn xây dựng một cái cây với Edge 'đã định nghĩa' như thế. Có lẽ, một tài sản được ánh xạ cho một cạnh? – sehe

+0

@sehe Cảm ơn. Tôi đã thêm định nghĩa biểu đồ vào câu hỏi. Các cạnh và đỉnh được thêm vào bởi các hàm boost :: add_edge và boost :: add_vertex – Jim

+0

Bạn đang tìm định nghĩa định dạng dấu chấm? http://www.graphviz.org/Gallery.php chỉ cần nhấp vào bất kỳ ví dụ nào và xem mã nó cần để làm cho chúng :-) –

Trả lời

6

Tôi đã cung cấp thông tin không hợp lệ lần đầu tiên. Đây là câu trả lời đúng.

#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

Cảm ơn nhưng tôi không thấy một phương pháp được gọi là WriteDOTFile .. Đây là đâu? – Jim

+0

@MartinKristiansen Vâng, nhưng điều này không giải thích được hàm .WriteDOTFile ở đâu? Tôi không chắc bạn đang ngụ ý điều gì. – Jim

+0

Cảm ơn bạn đã cập nhật. Có make_label_writer bằng cách nào đó chọn chuỗi từ cấu trúc Vertex? – Jim

21

Tôi vừa vấp phải câu hỏi này. Mặc dù nó có một câu trả lời được chấp nhận, tôi nghĩ rằng tôi sẽ thêm phiên bản của tôi quá.

Bạn đang sử dụng bundled property trong biểu đồ của mình. Cách chính xác để lấy bản đồ thuộc tính từ các thuộc tính đi kèm của bạn là sử dụng boost::get. Vì vậy, bạn có thể làm điều gì đó như:

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)), 
    ); 

Nơi đối tượng đồ thị bạn đã tạo.

+1

Bạn xứng đáng được đánh dấu IMHO: D –

+0

@ ChrisHuang-Leaver , :-) cảm ơn. – Vikas

+0

Tôi đã cùng một vấn đề, nhưng, thay vì thuộc tính công khai, tôi đã có một phương thức cho lớp đỉnh của tôi, hãy nói lớp Vertex {public: int getID(); riêng tư: int m_iID;}; Tôi nên làm gì trong trường hợp này để đặt ID trong tệp graphviz? – Jepessen

Các vấn đề liên quan