I am using fruchterman_reingold_force_directed_layout
algorithm on my graph
to get a cluster free layout. Below is code for my vertices and edge
using RectTopology = boost::rectangle_topology<>;
using point = RectTopology::point_type;
class MyVertex{
public:
MyVertex(){ myObject = NULL; }
Mybject* myObject;
point position;
std::string name;
};
class MyEdge{
public:
MyEdge(){ myLine = NULL; }
MyLine* myLine;
double weight;
};
//Boost graph defination
using graphT = boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS, MyVertex, MyEdge>;
using vertexT = boost::graph_traits<graphT>::vertex_descriptor; //Define Vertex
using vertexIt = boost::graph_traits<graphT>::vertex_iterator; //Vertex Iterator
using edgeT = boost::graph_traits<graphT>::edge_descriptor; //Define Edge
using edgeIt = boost::graph_traits<graphT>::edge_iterator; //Edge Iterator
forcedDirLay(){
boost::minstd_rand gen;
RectTopology rect_top(gen, 0, 0, 1, 1);
boost::random_graph_layout(myGraph, boost::get(&SLDVertex::position, myGraph), rect_top);
boost::fruchterman_reingold_force_directed_layout(myGraph, boost::get(&SLDVertex::position, myGraph), rect_top);
}
Imagine now I have a graph and perform my layout algorithm which all works fine and I have position info for every vertices.
How can I visualize each vertex where they end up after layout algorithm finished ? Is there a way to get position info to Dot file and I can visualize Dot file ?
I have a function to convert my graph to dot file but don't know how to get position info to dot file. Thanks in advance.
GraphToDotFile(){
std::ofstream dot(".\\graph.dot");
boost::write_graphviz(dot, myGraph,
boost::make_label_writer(boost::get(&MyVertex::name, myGraph)));
dot.close();
}
You can use dynamic properties to add graphviz attributes, see the example:
https://www.boost.org/doc/libs/1_74_0/libs/graph/example/graphviz.cpp
The attributes that specify the position in graphviz are here:
Position of node, or spline control points.
For nodes, the position indicates the center of the node. On output, the coordinates are in points.
In
neato
andfdp
, pos can be used to set the initial position of a node. By default, the coordinates are assumed to be in inches. However, the-s
command line flag can be used to specify different units. As the output coordinates are in points, feeding the output of a graph laid out by a Graphviz program intoneato
orfdp
will almost always require the-s
flag.When the
-n
command line flag is used withneato
, it is assumed the positions have been set by one of the layout programs, and are therefore in points. Thus,neato -n
can accept input correctly without requiring a-s
flag and, in fact, ignores any such flag.Valid for: Edges, Nodes.