Ticket #5121: planar_face_traversal_nab.cc

File planar_face_traversal_nab.cc, 2.6 KB (added by expaler, 12 years ago)

Modified program that properly initializes the edge index map.

Line 
1#include <boost/graph/graph_traits.hpp>
2#include <boost/graph/adjacency_list.hpp>
3#include <boost/graph/boyer_myrvold_planar_test.hpp>
4#include <boost/graph/planar_face_traversal.hpp>
5#include <iostream>
6
7using namespace boost;
8using namespace std;
9
10typedef adjacency_list<vecS,
11 vecS,
12 undirectedS,
13 property<vertex_index_t, int>,
14 property<edge_index_t, int>
15 > Graph;
16
17typedef std::vector< std::vector< graph_traits<Graph>::edge_descriptor > >
18 embedding_storage_t;
19typedef boost::iterator_property_map
20 < embedding_storage_t::iterator,
21 property_map<Graph, vertex_index_t>::type
22 >
23 embedding_t;
24
25struct face_output_visitor: public planar_face_traversal_visitor
26{
27 void begin_face() {
28 std::cout << "New face: ";
29 }
30
31 template <typename Vertex> void next_vertex(Vertex v) {
32 std::cout << v << " ";
33 }
34
35 void end_face() {
36 std::cout << "visitor done. " << std::endl;
37 }
38};
39
40int main(void)
41{
42 typedef pair<int,int> Edge;
43 Edge edge_array[] = {
44 Edge(1,0),
45 Edge(3,2),
46 Edge(4,2),
47 Edge(4,3),
48 Edge(5,2),
49 Edge(6,0),
50 Edge(6,3),
51 Edge(6,5),
52 Edge(7,1),
53 Edge(7,4),
54 Edge(7,5),
55 Edge(7,6),
56 Edge(8,0),
57 Edge(8,3),
58 Edge(9,1),
59 Edge(9,4),
60 Edge(9,8)
61 };
62
63 Graph G(10);
64
65 const int num_edges = sizeof(edge_array)/sizeof(edge_array[0]);
66 graph_traits<Graph>::edge_descriptor e;
67 bool b;
68 int e_index = 0;
69
70 for (int i = 0; i < num_edges; ++i) {
71 tie(e, b) = add_edge(edge_array[i].first, edge_array[i].second, G);
72 if (b) {
73 put(get(edge_index, G), e, e_index++);
74 }
75 }
76
77 embedding_storage_t embedding_storage(num_vertices(G));
78 embedding_t embedding(embedding_storage.begin(), get(vertex_index, G));
79
80 if (!boyer_myrvold_planarity_test(boyer_myrvold_params::graph = G, boyer_myrvold_params::embedding = embedding)) {
81 cerr << "not planar" << endl;
82 }
83
84 face_output_visitor f_vis;
85
86 cerr << "Bug: the graph is planar and 3-connected, \n"
87 << " (in fact, it's a cube with a triangular prism attached to one face),\n"
88 << "but the faces of a planar embedding are not detected."
89 << "\n\n"
90 << "Output that caused the bug report:\n"
91 << "New face: 1 0 visitor done. \n"
92 << "New face: 3 2 5 6 visitor done. \n"
93 << "New face: 4 visitor done. \n"
94 << "New face: 7 visitor done. \n"
95 << "New face: 8 visitor done. \n"
96 << "New face: 9 visitor done.\n"
97 << "\n\n"
98 << "Output calculated now:"
99 << endl;
100
101 planar_face_traversal(G, &embedding[0], f_vis);
102
103 return 0;
104}