From 49f1d2ba1bd1f4d802eaede15e652c90b9f08670 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 5 Apr 2019 09:18:55 +0200 Subject: [PATCH 1/6] replace the edge map by a vector of flat_map it is very efficient since there should not be isolated vertices. On large data, the runtime of the function is divided by 3 to 4 --- .../orient_polygon_soup.h | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h index 67b22a81ac0..20330b97256 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h @@ -60,9 +60,11 @@ struct Polygon_soup_orienter /// Container types typedef PointRange Points; typedef PolygonRange Polygons; - typedef std::map > Edge_map; - typedef typename Edge_map::iterator Edge_map_iterator; + typedef std::set Marked_edges; + typedef boost::container::flat_map< V_ID, boost::container::flat_set > Internal_map_type; + typedef std::vector< Internal_map_type > Edge_map; + typedef typename Internal_map_type::iterator Edge_map_iterator; /// Data members Points& points; //< the set of input points @@ -108,8 +110,8 @@ struct Polygon_soup_orienter { typedef std::pair VID_and_PID; if ( is_edge_marked(src,tgt,marked_edges) ) return VID_and_PID(src,300612); - Edge_map_iterator em_it=edges.find(V_ID_pair(tgt, src)); - if ( em_it==edges.end() ) return VID_and_PID(src,300612);// the vertex is on the border + Edge_map_iterator em_it=edges[tgt].find(src); + if ( em_it==edges[tgt].end() ) return VID_and_PID(src,300612);// the vertex is on the border CGAL_assertion(em_it->second.size()==1); P_ID p_id = *(em_it->second.begin()); return VID_and_PID(get_neighbor_vertices(src, p_id, polygons)[2], p_id); @@ -120,8 +122,8 @@ struct Polygon_soup_orienter { typedef std::pair VID_and_PID; if ( is_edge_marked(src,tgt,marked_edges) ) return VID_and_PID(tgt,300612); - Edge_map_iterator em_it=edges.find(V_ID_pair(tgt, src)); - if ( em_it==edges.end() ) return VID_and_PID(tgt,300612);// the vertex is on the border + Edge_map_iterator em_it=edges[tgt].find(src); + if ( em_it==edges[tgt].end() ) return VID_and_PID(tgt,300612);// the vertex is on the border CGAL_assertion(em_it->second.size()==1); P_ID p_id = *(em_it->second.begin()); return VID_and_PID(get_neighbor_vertices(tgt, p_id, polygons)[0], p_id); @@ -155,7 +157,7 @@ struct Polygon_soup_orienter } Polygon_soup_orienter(Points& points, Polygons& polygons) - : points(points), polygons(polygons) + : points(points), polygons(polygons), edges(points.size()) {} //filling containers @@ -168,7 +170,7 @@ struct Polygon_soup_orienter for (P_ID j = 0; j < size; ++j) { V_ID i0 = polygons[i][j]; V_ID i1 = polygons[i][(j + 1) % size]; - edges[V_ID_pair(i0, i1)].insert(i); + edges[i0][i1].insert(i); } } @@ -182,10 +184,10 @@ struct Polygon_soup_orienter V_ID i1 = polygons[i][(j + 1) % size]; std::size_t nb_edges = 0; - Edge_map_iterator em_it = edges.find(V_ID_pair(i0, i1)); - if (em_it != edges.end()) nb_edges += em_it->second.size(); - em_it = edges.find(V_ID_pair(i1, i0)); - if (em_it != edges.end()) nb_edges += em_it->second.size(); + Edge_map_iterator em_it = edges[i0].find(i1); + if (em_it != edges[i0].end()) nb_edges += em_it->second.size(); + em_it = edges[i1].find(i0); + if (em_it != edges[i1].end()) nb_edges += em_it->second.size(); if (nb_edges > 2) set_edge_marked(i0, i1, marked_edges); } @@ -249,17 +251,17 @@ struct Polygon_soup_orienter if( is_edge_marked(i1,i2,marked_edges) ) continue; // edge (i1,i2) - Edge_map_iterator it_same_orient = edges.find(V_ID_pair(i1, i2)); + Edge_map_iterator it_same_orient = edges[i1].find(i2); // edges (i2,i1) - Edge_map_iterator it_other_orient = edges.find(V_ID_pair(i2, i1)); + Edge_map_iterator it_other_orient = edges[i2].find(i1); - CGAL_assertion(it_same_orient != edges.end()); - CGAL_assertion(it_other_orient == edges.end() || + CGAL_assertion(it_same_orient != edges[i1].end()); + CGAL_assertion(it_other_orient == edges[i2].end() || it_other_orient->second.size()==1); if (it_same_orient->second.size() > 1) { - CGAL_assertion(it_other_orient == edges.end()); + CGAL_assertion(it_other_orient == edges[i2].end()); // one neighbor but with the same orientation P_ID index = *(it_same_orient->second.begin()); if(index == to_be_oriented_index) @@ -276,25 +278,25 @@ struct Polygon_soup_orienter for(P_ID j = 0; j < size; ++j) { V_ID i0 = polygons[index][j]; V_ID i1 = polygons[index][(j+1)%size]; - Edge_map_iterator em_it = edges.find(V_ID_pair(i0, i1)); + Edge_map_iterator em_it = edges[i0].find(i1); CGAL_assertion_code(const bool r = ) em_it->second.erase(index) CGAL_assertion_code(!= 0); CGAL_assertion(r); - if ( em_it->second.empty() ) edges.erase(em_it); + if ( em_it->second.empty() ) edges[i0].erase(em_it); } inverse_orientation(index); for(P_ID j = 0; j < size; ++j) { V_ID i0 = polygons[index][j]; V_ID i1 = polygons[index][(j+1)%size]; - edges[V_ID_pair(i0, i1)].insert(index); + edges[i0][i1].insert(index); } // "inverse the orientation of polygon #index oriented[index] = true; stack.push(index); } else{ - if( it_other_orient != edges.end() ){ + if( it_other_orient != edges[i2].end() ){ CGAL_assertion(it_same_orient->second.size() == 1); CGAL_assertion(it_other_orient->second.size() == 1); // one polygon, same orientation @@ -377,6 +379,7 @@ struct Polygon_soup_orienter /// now duplicate the vertices typedef std::pair > V_ID_and_Polygon_ids; + edges.resize(edges.size()+vertices_to_duplicate.size()); BOOST_FOREACH(const V_ID_and_Polygon_ids& vid_and_pids, vertices_to_duplicate) { V_ID new_index = static_cast(points.size()); From f972d0a228e8209b62abefb78b30db0404ed9007 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 5 Apr 2019 11:40:47 +0200 Subject: [PATCH 2/6] init edge map for is_polygon_mesh_a_polygon_soup --- .../CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h index d3f70c87401..3be3f9332ca 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h @@ -180,7 +180,7 @@ public: //check manifoldness typedef std::vector PointRange; typedef internal::Polygon_soup_orienter Orienter; - typename Orienter::Edge_map edges; + typename Orienter::Edge_map edges(max_id+1); typename Orienter::Marked_edges marked_edges; Orienter::fill_edge_map(edges, marked_edges, polygons); //returns false if duplication is necessary From 07d1601ec9363e766006339ad093d785434b7510 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 5 Apr 2019 12:17:17 +0200 Subject: [PATCH 3/6] remove useless (and harmful for the new method) call to clear --- .../include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h index 20330b97256..ab789adee74 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h @@ -163,7 +163,6 @@ struct Polygon_soup_orienter //filling containers static void fill_edge_map(Edge_map& edges, Marked_edges& marked_edges, const Polygons& polygons) { // Fill edges - edges.clear(); for (P_ID i = 0; i < polygons.size(); ++i) { const P_ID size = polygons[i].size(); From 028fcd7b346bd6770e229b3513af35ea41097e4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 10 Apr 2019 11:06:26 +0200 Subject: [PATCH 4/6] add missing include directive --- .../include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h index ab789adee74..8a0b79d5002 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h @@ -32,6 +32,7 @@ #include #include #include +#include #include #include From 03ec0dfbe1f3e276d1a87715c599a014792c02bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 12 Apr 2019 19:09:25 +0200 Subject: [PATCH 5/6] update demo plugin --- Polyhedron/demo/Polyhedron/Plugins/PMP/Orient_soup_plugin.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Orient_soup_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Orient_soup_plugin.cpp index 0ef8e67a5f3..317a9c1c90c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Orient_soup_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Orient_soup_plugin.cpp @@ -300,10 +300,10 @@ void Polyhedron_demo_orient_soup_plugin::getNMPoints( Scene_polygon_soup_item* item) { typedef std::pair V_ID_pair; - typedef std::map > Edge_map; - typedef std::set Marked_edges; typedef CGAL::Polygon_mesh_processing::internal::Polygon_soup_orienter PSO; + typedef PSO::Edge_map Edge_map; + typedef std::set Marked_edges; Edge_map edges; Marked_edges m_edges; From 7945ffeea23b3b1b815fa46673a857b03371695b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 12 Apr 2019 19:11:04 +0200 Subject: [PATCH 6/6] update surf plugin --- .../demo/Polyhedron/include/CGAL/IO/read_surf_trianglemesh.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polyhedron/demo/Polyhedron/include/CGAL/IO/read_surf_trianglemesh.h b/Polyhedron/demo/Polyhedron/include/CGAL/IO/read_surf_trianglemesh.h index 9c4c9041b0d..121608f1906 100644 --- a/Polyhedron/demo/Polyhedron/include/CGAL/IO/read_surf_trianglemesh.h +++ b/Polyhedron/demo/Polyhedron/include/CGAL/IO/read_surf_trianglemesh.h @@ -286,7 +286,7 @@ bool read_surf(std::istream& input, std::vector& output, Mesh& mesh = output[i]; - PMP::internal::Polygon_soup_to_polygon_mesh + PMP::internal::Polygon_soup_to_polygon_mesh, std::vector> converter(points, polygons); converter(mesh, false/*insert_isolated_vertices*/);