我正在尝试创建一个显示简单图形的应用程序,因为我使用boost :: graph作为底层数据结构,我想使用中提供的布局算法。图书馆也是如此。
这里给出的答案解释了如何在boost库中使用布局算法来布局图的顶点: How does the attractive force of Fruchterman Reingold work with Boost Graph Library
但遗憾的是,它没有解释如何 - 在计算布局之后 - 实际上可以访问顶点的坐标。即使我们得到一个位置向量(或者更确切地说是点),浮点组件也是私有的,所以这并没有帮助。 boost :: graph文档也没有解决这个问题。
那么在应用布局算法后,如何检索每个顶点的简单(X,Y)坐标?
答案 0 :(得分:2)
在查看了boost图源代码之后,事实证明这并不是那么难。 我们可以使用属性映射迭代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;
}
}