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; }
int main () { // Construct the initial arrangement. Arrangement_2 arr; Segment_2 segs[N_SEGMENTS]; Halfedge_handle hhs[N_SEGMENTS]; bool valid; int k; segs[0] = Segment_2 (Point_2 (5, 9), Point_2 (5, 11)); segs[1] = Segment_2 (Point_2 (5, 9), Point_2 (7, 9)); segs[2] = Segment_2 (Point_2 (5, 11), Point_2 (7, 9)); segs[3] = Segment_2 (Point_2 (7, 6), Point_2 (9, 7)); segs[4] = Segment_2 (Point_2 (9, 7), Point_2 (7, 9)); segs[5] = Segment_2 (Point_2 (5, 9), Point_2 (7, 6)); segs[6] = Segment_2 (Point_2 (10, 11), Point_2 (8, 13)); segs[7] = Segment_2 (Point_2 (8, 13), Point_2 (11, 12)); segs[8] = Segment_2 (Point_2 (10, 11), Point_2 (11, 12)); segs[9] = Segment_2 (Point_2 (1, 20), Point_2 (5, 1)); segs[10] = Segment_2 (Point_2 (5, 1), Point_2 (12, 6)); segs[11] = Segment_2 (Point_2 (1, 20), Point_2 (12, 6)); segs[12] = Segment_2 (Point_2 (13, 13), Point_2 (13, 15)); segs[13] = Segment_2 (Point_2 (13, 15), Point_2 (15, 12)); segs[14] = Segment_2 (Point_2 (13, 13), Point_2 (15, 12)); segs[15] = Segment_2 (Point_2 (11, 12), Point_2 (13, 13)); segs[16] = Segment_2 (Point_2 (1, 20), Point_2 (11, 17)); segs[17] = Segment_2 (Point_2 (11, 17), Point_2 (20, 13)); segs[18] = Segment_2 (Point_2 (12, 6), Point_2 (20, 13)); segs[19] = Segment_2 (Point_2 (15, 12), Point_2 (20, 13)); segs[20] = Segment_2 (Point_2 (5, 1), Point_2 (20, 1)); segs[21] = Segment_2 (Point_2 (20, 1), Point_2 (20, 13)); segs[22] = Segment_2 (Point_2 (15, 5), Point_2 (17, 3)); segs[23] = Segment_2 (Point_2 (13, 3), Point_2 (17, 3)); segs[24] = Segment_2 (Point_2 (12, 6), Point_2 (13, 3)); segs[25] = Segment_2 (Point_2 (17, 3), Point_2 (20, 1)); for (k = 0; k < N_SEGMENTS; k++) { hhs[k] = insert_non_intersecting_curve (arr, segs[k]); } 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 some edges. int del_indices[N_REMOVE] = {25, 23, 22, 1, 3, 11, 19, 15, 4, 24}; for (k = 0; k < N_REMOVE; k++) { arr.remove_edge (hhs[del_indices[k]]); valid = arr.is_valid(); std::cout << " Removed " << k+1 << " segment(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; // Check the validity more thoroughly. valid = is_valid(arr); std::cout << "Arrangement is " << (valid ? "valid." : "NOT valid!") << std::endl; return (0); }