Face_index_observer (Arrangement_2& arr) : CGAL::Arr_observer<Arrangement_2> (arr), n_faces (0) { CGAL_precondition (arr.is_empty()); arr.unbounded_face()->set_data (0); n_faces++; }
int main() { // Step(a) - construct a triangular face. Arrangement_2 arr; Segment_2 s1(Point_2(667, 1000), Point_2(4000, 5000)); Segment_2 s2(Point_2(4000, 0), Point_2(4000, 5000)); Segment_2 s3(Point_2(667, 1000), Point_2(4000, 0)); Halfedge_handle e1 = arr.insert_in_face_interior(s1, arr.unbounded_face()); Vertex_handle v1 = e1->source(); Vertex_handle v2 = e1->target(); Halfedge_handle e2 = arr.insert_from_right_vertex(s2, v2); Vertex_handle v3 = e2->target(); arr.insert_at_vertices(s3, v3, v1); // Step (b) - create additional two faces inside the triangle. Point_2 p1(4000, 3666), p2(4000, 1000); Segment_2 s4(Point_2(4000, 5000), p1); Segment_2 s5(p1, p2); Segment_2 s6(Point_2(4000, 0), p2); Halfedge_handle e4 = arr.split_edge(e2, s4, Segment_2(Point_2(4000, 0), p1)); Vertex_handle w1 = e4->target(); Halfedge_handle e5 = arr.split_edge(e4->next(), s5, s6); Vertex_handle w2 = e5->target(); Halfedge_handle e6 = e5->next(); Segment_2 s7(p1, Point_2(3000, 2666)); Segment_2 s8(p2, Point_2(3000, 1333)); Segment_2 s9(Point_2(3000, 2666), Point_2(2000, 1666)); Segment_2 s10(Point_2(3000, 1333), Point_2(2000, 1666)); Segment_2 s11(Point_2(3000, 1333), Point_2(3000, 2666)); Halfedge_handle e7 = arr.insert_from_right_vertex(s7, w1); Vertex_handle v4 = e7->target(); Halfedge_handle e8 = arr.insert_from_right_vertex(s8, w2); Vertex_handle v5 = e8->target(); Vertex_handle v6 = arr.insert_in_face_interior(Point_2(2000, 1666), e8->face()); arr.insert_at_vertices(s9, v4, v6); arr.insert_at_vertices(s10, v5, v6); arr.insert_at_vertices(s11, v4, v5); // Step(c) - remove and merge faces to form a single hole in the traingle. arr.remove_edge(e7); arr.remove_edge(e8); e5 = arr.merge_edge(e5, e6, Segment_2(e5->source()->point(), e6->target()->point())); e2 = arr.merge_edge(e4, e5, s2); print_arrangement(arr); return 0; }
int main () { Arrangement_2 arr; // Construct an arrangement of seven intersecting line segments. insert (arr, Segment_2 (Point_2 (1, 1), Point_2 (7, 1))); insert (arr, Segment_2 (Point_2 (1, 1), Point_2 (3, 7))); insert (arr, Segment_2 (Point_2 (1, 4), Point_2 (7, 1))); insert (arr, Segment_2 (Point_2 (2, 2), Point_2 (9, 3))); insert (arr, Segment_2 (Point_2 (2, 2), Point_2 (4, 4))); insert (arr, Segment_2 (Point_2 (7, 1), Point_2 (9, 3))); insert (arr, Segment_2 (Point_2 (3, 7), Point_2 (9, 3))); // Create a mapping of the arrangement faces to indices. CGAL::Arr_face_index_map<Arrangement_2> index_map (arr); // Perform breadth-first search from the unbounded face, and use the BFS // visitor to associate each arrangement face with its discover time. Discover_time_bfs_visitor<CGAL::Arr_face_index_map<Arrangement_2> > bfs_visitor (index_map); Arrangement_2::Face_handle uf = arr.unbounded_face(); boost::breadth_first_search (Dual_arrangement_2 (arr), uf, boost::vertex_index_map (index_map). visitor (bfs_visitor)); // Print the results: Arrangement_2::Face_iterator fit; for (fit = arr.faces_begin(); fit != arr.faces_end(); ++fit) { std::cout << "Discover time " << fit->data() << " for "; if (fit != uf) { std::cout << "face "; print_ccb<Arrangement_2> (fit->outer_ccb()); } else std::cout << "the unbounded face." << std::endl; } return (0); }
int main() { Arrangement_2 arr; // Construct an arrangement of five linear objects. std::vector<X_monotone_curve_2> curves; curves.push_back(Ray_2(Point_2(0, 0), Point_2(0, 1))); curves.push_back(Ray_2(Point_2(0, 0), Point_2(1, 0))); curves.push_back(Ray_2(Point_2(0, 0), Point_2(0, -1))); curves.push_back(Ray_2(Point_2(0, 0), Point_2(-1, 0))); curves.push_back(Ray_2(Point_2(0, 0), Point_2(1, 1))); curves.push_back(Ray_2(Point_2(0, 0), Point_2(1, -1))); curves.push_back(Ray_2(Point_2(0, 0), Point_2(-1, 1))); curves.push_back(Ray_2(Point_2(0, 0), Point_2(-1, -1))); std::vector<Halfedge_handle> hhs(curves.size()); for (size_t i = 0; i < curves.size(); i++) hhs[i] = insert_non_intersecting_curve(arr, curves[i]); bool valid = arr.is_valid(); std::cout << "Arrangement size:" << " V = " << arr.number_of_vertices() << ", E = " << arr.number_of_edges() << ", F = " << arr.number_of_faces() << std::endl; std::cout << "The arrangement is " << (valid ? "valid." : "NOT valid!") << std::endl; if (! valid) return (1); // Remove the edges. for (size_t i = 0; i < hhs.size(); i++) { arr.remove_edge(hhs[i]); bool valid = arr.is_valid(); std::cout << " Removed " << i+1 << " curve(s), arrangement is " << (valid ? "valid." : "NOT valid!") << std::endl; if (! valid) return (1); } std::cout << "Final arrangement size:" << " V = " << arr.number_of_vertices() << ", E = " << arr.number_of_edges() << ", F = " << arr.number_of_faces() << std::endl; if (!::test(arr)) return 1; /* Construct another arrangement of a segment connected to a ray. * First remove the ray, then remove the segment. * * o---------------o * | | * | | * | | * | o--o----| * | | * | | * | | * o---------------o */ if (!test_ray(arr, arr.unbounded_face())) return 1; /* Construct another arrangement of a segment connected to a ray. * First remove the ray, then remove the segment. * * o---------------o * | | * | | * | | * | o--o----| * | | * o---------------o * | | * o---------------o */ Line_2 l1(Point_2(0, -1), Point_2(1, -1)); Halfedge_handle eh1 = arr.insert_in_face_interior(X_monotone_curve_2(l1), arr.unbounded_face()); if (!test_ray(arr, eh1->face())) return 1; arr.remove_edge(eh1); /* Construct another arrangement of a segment connected to a ray. * First remove the ray, then remove the segment. * * o-----o---------o * | | | * | | | * | | | * | | o--o----| * | | | * | | | * | | | * o-----o---------o */ Line_2 l2(Point_2(-1, 0), Point_2(-1, 1)); Halfedge_handle eh2 = arr.insert_in_face_interior(X_monotone_curve_2(l2), arr.unbounded_face()); if (!test_ray(arr, eh2->twin()->face())) return 1; arr.remove_edge(eh2); return 0; }