int main() { Arrangement_2 arr; // Construct an arrangement of seven intersecting line segments. // We keep a handle for the vertex v_0 that corresponds to the point (1,1). Arrangement_2::Halfedge_handle e = insert_non_intersecting_curve (arr, Segment_2 (Point_2 (1, 1), Point_2 (7, 1))); Arrangement_2::Vertex_handle v0 = e->source(); 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 vertices to indices. Arr_vertex_index_map index_map(arr); // Perform Dijkstra's algorithm from the vertex v0. Edge_length_func edge_length; boost::vector_property_map<double, Arr_vertex_index_map> dist_map(static_cast<unsigned int>(arr.number_of_vertices()), index_map); boost::dijkstra_shortest_paths(arr, v0, boost::vertex_index_map(index_map). weight_map(edge_length). distance_map(dist_map)); // Print the results: Arrangement_2::Vertex_iterator vit; std::cout << "The distances of the arrangement vertices from (" << v0->point() << ") :" << std::endl; for (vit = arr.vertices_begin(); vit != arr.vertices_end(); ++vit) std::cout << "(" << vit->point() << ") at distance " << dist_map[vit] << std::endl; return 0; }
int main(int argc, char *argv[]) { // Get the name of the input file from the command line, or use the default // points.dat file if no command-line parameters are given. const char * filename = (argc > 1) ? argv[1] : "coll_points.dat"; // Open the input file. std::ifstream in_file(filename); if (! in_file.is_open()) { std::cerr << "Failed to open " << filename << " ..." << std::endl; return (1); } // Read the points from the file, and consturct their dual lines. std::vector<Point_2> points; std::list<X_monotone_curve_2> dual_lines; unsigned int n; in_file >> n; points.resize(n); unsigned int k; for (k = 0; k < n; ++k) { int px, py; in_file >> px >> py; points[k] = Point_2(px, py); // The line dual to the point (p_x, p_y) is y = p_x*x - p_y, // or: p_x*x - y - p_y = 0: Line_2 dual_line = Line_2(CGAL::Exact_rational(px), CGAL::Exact_rational(-1), CGAL::Exact_rational(-py)); // Generate the x-monotone curve based on the line and the point index. dual_lines.push_back(X_monotone_curve_2(dual_line, k)); } in_file.close(); // Construct the dual arrangement by aggragately inserting the lines. Arrangement_2 arr; insert(arr, dual_lines.begin(), dual_lines.end()); // Look for vertices whose degree is greater than 4. Arrangement_2::Vertex_const_iterator vit; Arrangement_2::Halfedge_around_vertex_const_circulator circ; size_t d; for (vit = arr.vertices_begin(); vit != arr.vertices_end(); ++vit) { if (vit->degree() > 4) { // There should be vit->degree()/2 lines intersecting at the current // vertex. We print their primal points and their indices. circ = vit->incident_halfedges(); for (d = 0; d < vit->degree() / 2; d++) { k = circ->curve().data(); // The index of the primal point. std::cout << "Point no. " << k+1 << ": (" << points[k] << "), "; ++circ; } std::cout << "are collinear." << std::endl; } } return 0; }
int main () { // Construct an arrangement containing three RED line segments. Arrangement_2 arr; Landmarks_pl pl (arr); Segment_2 s1 (Point_2(-1, -1), Point_2(1, 3)); Segment_2 s2 (Point_2(2, 0), Point_2(3, 3)); Segment_2 s3 (Point_2(0, 3), Point_2(2, 5)); insert (arr, Colored_segment_2 (s1, RED), pl); insert (arr, Colored_segment_2 (s2, RED), pl); insert (arr, Colored_segment_2 (s3, RED), pl); // Insert three BLUE line segments. Segment_2 s4 (Point_2(-1, 3), Point_2(4, 1)); Segment_2 s5 (Point_2(-1, 0), Point_2(4, 1)); Segment_2 s6 (Point_2(-2, 1), Point_2(1, 4)); insert (arr, Colored_segment_2 (s4, BLUE), pl); insert (arr, Colored_segment_2 (s5, BLUE), pl); insert (arr, Colored_segment_2 (s6, BLUE), pl); // Go over all vertices and print just the ones corresponding to intersection // points between RED segments and BLUE segments. Note that we skip endpoints // of overlapping sections. Arrangement_2::Vertex_const_iterator vit; Segment_color color; for (vit = arr.vertices_begin(); vit != arr.vertices_end(); ++vit) { // Go over the incident halfedges of the current vertex and examine their // colors. bool has_red = false; bool has_blue = false; Arrangement_2::Halfedge_around_vertex_const_circulator eit, first; eit = first = vit->incident_halfedges(); do { // Get the color of the current half-edge. if (eit->curve().data().size() == 1) { color = eit->curve().data().front(); if (color == RED) has_red = true; else if (color == BLUE) has_blue = true; } ++eit; } while (eit != first); // Print the vertex only if incident RED and BLUE edges were found. if (has_red && has_blue) { std::cout << "Red-blue intersection at (" << vit->point() << ")" << std::endl; } } // Locate the edges that correspond to a red-blue overlap. Arrangement_2::Edge_iterator eit; for (eit = arr.edges_begin(); eit != arr.edges_end(); ++eit) { // Go over the incident edges of the current vertex and examine their // colors. bool has_red = false; bool has_blue = false; Traits_2::Data_container::const_iterator dit; for (dit = eit->curve().data().begin(); dit != eit->curve().data().end(); ++dit) { if (*dit == RED) has_red = true; else if (*dit == BLUE) has_blue = true; } // Print the edge only if it corresponds to a red-blue overlap. if (has_red && has_blue) std::cout << "Red-blue overlap at [" << eit->curve() << "]" << std::endl; } return 0; }