//! \file examples/Arrangement_on_surface_2/bgl_dual_adapter.cpp // Adapting the dual of an arrangement to a BGL graph. #include "arr_rational_nt.h" #include #include #include #include #include #include #include #include #include #include "arr_print.h" // A property map that reads/writes the information to/from the extended // face. template class Extended_face_property_map { public: typedef typename Arrangement::Face_handle Face_handle; // Boost property type definitions. typedef boost::read_write_property_map_tag category; typedef Type value_type; typedef value_type& reference; typedef Face_handle key_type; // The get function is required by the property map concept. friend reference get(const Extended_face_property_map& map, key_type key) { return key->data(); } // The put function is required by the property map concept. friend void put(const Extended_face_property_map& map, key_type key, value_type val) { key->set_data(val); } }; typedef CGAL::Cartesian Kernel; typedef CGAL::Arr_segment_traits_2 Traits_2; typedef CGAL::Arr_face_extended_dcel Dcel; typedef CGAL::Arrangement_2 Ex_arrangement; typedef CGAL::Dual Dual_arrangement; typedef CGAL::Arr_face_index_map Face_index_map; typedef Extended_face_property_map Face_property_map; typedef Kernel::Point_2 Point_2; typedef Kernel::Segment_2 Segment_2; int main() { // Construct an arrangement of seven intersecting line segments. Point_2 p1(1, 1), p2(1, 4), p3(2, 2), p4(3, 7), p5(4, 4), p6(7, 1), p7(9, 3); Ex_arrangement arr; insert(arr, Segment_2(p1, p6)); insert(arr, Segment_2(p1, p4)); insert(arr, Segment_2(p2, p6)); insert(arr, Segment_2(p3, p7)); insert(arr, Segment_2(p3, p5)); insert(arr, Segment_2(p6, p7)); insert(arr, Segment_2(p4, p7)); // Create a mapping of the arrangement faces to indices. Face_index_map index_map(arr); // Perform breadth-first search from the unbounded face, using the event // visitor to associate each arrangement face with its discover time. unsigned int time = 0; boost::breadth_first_search(Dual_arrangement(arr), arr.unbounded_face(), boost::vertex_index_map(index_map).visitor (boost::make_bfs_visitor (stamp_times(Face_property_map(), time, boost::on_discover_vertex())))); // Print the discover time of each arrangement face. Ex_arrangement::Face_iterator fit; for (fit = arr.faces_begin(); fit != arr.faces_end(); ++fit) { std::cout << "Discover time " << fit->data() << " for "; if (fit != arr.unbounded_face()) { std::cout << "face "; print_ccb(fit->outer_ccb()); } else std::cout << "the unbounded face." << std::endl; } return 0; }