diff --git a/Triangulation_3/include/CGAL/Constrained_Delaunay_triangulation_3.h b/Triangulation_3/include/CGAL/Constrained_Delaunay_triangulation_3.h index 7007baea4b8..d3f1c424feb 100644 --- a/Triangulation_3/include/CGAL/Constrained_Delaunay_triangulation_3.h +++ b/Triangulation_3/include/CGAL/Constrained_Delaunay_triangulation_3.h @@ -581,7 +581,8 @@ public: return polygon_contraint_id; } - auto sequence_of_Steiner_vertices(Vertex_handle va, Vertex_handle vb) const + std::optional> + sequence_of_Steiner_vertices(Vertex_handle va, Vertex_handle vb) const { std::vector steiner_vertices; const auto c_id = this->constraint_from_extremities(va, vb); @@ -613,9 +614,9 @@ public: } } } else { - CGAL_error(); + return std::nullopt; } - return steiner_vertices; + return {std::move(steiner_vertices)}; } private: diff --git a/Triangulation_3/test/Triangulation_3/cdt_3_from_off.cpp b/Triangulation_3/test/Triangulation_3/cdt_3_from_off.cpp index 55e4320cc73..79c2e909ca1 100644 --- a/Triangulation_3/test/Triangulation_3/cdt_3_from_off.cpp +++ b/Triangulation_3/test/Triangulation_3/cdt_3_from_off.cpp @@ -53,10 +53,26 @@ struct CDT_options std::string output_filename{"dump.off"}; std::string dump_patches_after_merge_filename{}; std::string dump_patches_borders_prefix{}; + std::string dump_after_conforming_filename{}; }; int go(Mesh, CDT_options); +void help(std::ostream& out) { + out << R"( +Usage: cdt_3_from_off [options] input.off output.off + + input.off: input mesh + output.off: output mesh + + --merge-facets: merge facets into patches + --ratio: ratio of faces to remove (default: 0) + --dump-patches-after-merge: dump patches after merging facets + --dump-patches-borders-prefix: dump patches borders + --dump-after-conforming: dump mesh after conforming +)"; +} + int main(int argc, char* argv[]) { std::cerr.precision(17); @@ -78,8 +94,15 @@ int main(int argc, char* argv[]) } else if(arg == "--dump-patches-borders-prefix") { assert(i + 1 < argc); options.dump_patches_borders_prefix = argv[++i]; + } else if(arg == "--dump-after-conforming") { + assert(i + 1 < argc); + options.dump_after_conforming_filename = argv[++i]; + } else if(arg == "--help") { + help(std::cout); + return 0; } else if(arg[0] == '-') { std::cerr << "Unknown option: " << arg << '\n'; + help(std::cerr); return 1; } else { switch(positional) { @@ -445,29 +468,32 @@ int go(Mesh mesh, CDT_options options) { } } // not merge_facets cdt.restore_Delaunay(); - // for(auto e: edges(mesh)) { - // auto he = halfedge(e, mesh); - // auto p1 = get(pmap, target(he, mesh)); - // auto p2 = get(pmap, source(he, mesh)); - // auto n = cdt.number_of_vertices(); - // auto v1 = cdt.insert(p1); - // auto v2 = cdt.insert(p2); - // CGAL_assertion(n == cdt.number_of_vertices()); - // auto steiner_vertices = cdt.sequence_of_Steiner_vertices(v1, v2); - // for(auto v: steiner_vertices) { - // he = CGAL::Euler::split_edge(he, mesh); - // put(pmap, target(he, mesh), v->point()); - // } - // } - // std::ofstream out_mesh("out-conforming.off"); - // out_mesh.precision(17); - // out_mesh << mesh; - // out_mesh.close(); - // { - // std::ofstream all_edges("dump_all_segments.polylines.txt"); - // all_edges.precision(17); - // cdt.write_all_segments_file(all_edges); - // } + + if(!options.dump_after_conforming_filename.empty()) { + for(auto e: edges(mesh)) { + auto he = halfedge(e, mesh); + auto vd1 = target(he, mesh); + auto vd2 = source(he, mesh); + if(!get(v_selected_map, vd1) || !get(v_selected_map, vd2)) continue; + auto p1 = get(pmap, vd1); + auto p2 = get(pmap, vd2); + auto n = cdt.number_of_vertices(); + auto v1 = cdt.insert(p1); + auto v2 = cdt.insert(p2); + std::cerr << std::format("edge {} {}\n", CGAL::IO::oformat(p1), CGAL::IO::oformat(p2)); + CGAL_assertion(n == cdt.number_of_vertices()); + auto steiner_vertices = cdt.sequence_of_Steiner_vertices(v1, v2); + if(!steiner_vertices) continue; + for(auto v: *steiner_vertices) { + he = CGAL::Euler::split_edge(he, mesh); + put(pmap, target(he, mesh), v->point()); + } + } + std::ofstream out_mesh(options.dump_after_conforming_filename); + out_mesh.precision(17); + out_mesh << mesh; + out_mesh.close(); + } std::cerr << "Number of vertices after conforming: " << cdt.number_of_vertices() << '\n'; assert(cdt.is_conforming());