diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_profile.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_profile.h index 91f778990f2..53fd33e5739 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_profile.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_profile.h @@ -104,15 +104,26 @@ public : edge_descriptor const& v0_vR() const { return mV0VR; } edge_descriptor const& vR_v1() const { return mVRV1; } - Triangle_vector const& triangles() const { return mTriangles ; } + Triangle_vector const& triangles() const { + + if(mTriangles.empty()){ + const_cast(this)->Extract_triangles_and_link(); + } + CGAL_HISTOGRAM_PROFILER("triangles.size()", mTriangles.size()); + return mTriangles ; } // The cycle of vertices around the edge vertex_descriptor_vector const& link() const { CGAL_PROFILER("link calls"); + if(mLink.empty()){ + + const_cast(this)->Extract_triangles_and_link(); + } return mLink ; } - edge_descriptor_vector const& border_edges() const { return mBorderEdges ; } - + edge_descriptor_vector const& border_edges() const { + return mBorderEdges ; + } ECM& surface() const { return *mSurface ; } ECM& surface_mesh() const { return *mSurface ; } @@ -132,30 +143,22 @@ private: typedef typename GraphTraits::in_edge_iterator in_edge_iterator ; - typedef std::set IdxSet; private: - template void Extract_borders( vertex_descriptor const& v - , IdxSet& rCollected - , EdgeIdxMap const& edge_idx - , EdgeIsBorderMap const& is_border + , std::set& rCollected ) ; - template - void Extract_borders( EdgeIdxMap const& edge_idx, EdgeIsBorderMap const& is_border) ; + void Extract_borders() ; - template void Extract_triangle( vertex_descriptor const& v0 , vertex_descriptor const& v1 , vertex_descriptor const& v2 , edge_descriptor const& e02 - , EdgeIsBorderMap const& is_border ) ; - template - void Extract_triangles_and_link( VertexIdxMap const& vertex_idx, EdgeIsBorderMap const& is_border ) ; + void Extract_triangles_and_link() ; private: diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_profile_impl.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_profile_impl.h index 18ddbaf96b0..90a11749ef3 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_profile_impl.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_profile_impl.h @@ -32,9 +32,9 @@ template Edge_profile::Edge_profile ( edge_descriptor const& aV0V1 , ECM& aSurface - , VertexIdxMap const& vertex_idx - , EdgeIdxMap const& edge_idx - , EdgeIsBorderMap const& is_border + , VertexIdxMap const& + , EdgeIdxMap const& + , EdgeIsBorderMap const& ) : mV0V1(aV0V1) @@ -43,6 +43,7 @@ Edge_profile::Edge_profile ( edge_descriptor const& aV0V1 { CGAL_PROFILER("Edge_profile constructor calls"); mLink.reserve(12); + mTriangles.reserve(16); mV1V0 = opposite_edge(v0_v1(),surface_mesh()); mV0 = source(v0_v1(),surface_mesh()); @@ -53,8 +54,8 @@ Edge_profile::Edge_profile ( edge_descriptor const& aV0V1 mP0 = get(vertex_point,surface_mesh(),mV0); mP1 = get(vertex_point,surface_mesh(),mV1); - mIsBorderV0V1 = is_border[v0_v1()]; - mIsBorderV1V0 = is_border[v1_v0()]; + mIsBorderV0V1 = v0_v1()->is_border(); + mIsBorderV1V0 = v1_v0()->is_border(); if ( left_face_exists() ) { @@ -88,16 +89,13 @@ Edge_profile::Edge_profile ( edge_descriptor const& aV0V1 CGAL_SURF_SIMPL_TEST_assertion( mV1V0->is_border() ) ; } - Extract_triangles_and_link(vertex_idx,is_border); - Extract_borders(edge_idx,is_border); + //Extract_triangles_and_link(); + Extract_borders(); } template -template void Edge_profile::Extract_borders( vertex_descriptor const& v - , IdxSet& rCollected - , EdgeIdxMap const& edge_idx - , EdgeIsBorderMap const& is_border + , std::set& rCollected ) { in_edge_iterator eb, ee ; @@ -106,17 +104,16 @@ void Edge_profile::Extract_borders( vertex_descriptor const& v edge_descriptor edge = *eb ; edge_descriptor opp_edge = opposite_edge(edge,surface_mesh()) ; - bool is_edge_border = is_border[edge] ; - bool is_opp_edge_border = is_border[opp_edge] ; + bool is_edge_border = edge->is_border() ; + bool is_opp_edge_border = opp_edge->is_border() ; if ( is_edge_border || is_opp_edge_border ) { - std::size_t eidx = edge_idx[edge]; - bool lNotCollected = rCollected.find(eidx) == rCollected.end() ; + bool lNotCollected = rCollected.find(edge) == rCollected.end() ; if ( lNotCollected ) { - rCollected.insert(eidx); - rCollected.insert(edge_idx[opp_edge]); + rCollected.insert(edge); + rCollected.insert(opp_edge); edge_descriptor border_edge = is_edge_border ? edge : opp_edge ; @@ -127,12 +124,11 @@ void Edge_profile::Extract_borders( vertex_descriptor const& v } template -template -void Edge_profile::Extract_borders( EdgeIdxMap const& edge_idx, EdgeIsBorderMap const& is_border) +void Edge_profile::Extract_borders() { - IdxSet lCollected ; - Extract_borders(mV0,lCollected,edge_idx,is_border); - Extract_borders(mV1,lCollected,edge_idx,is_border); + std::set lCollected ; + Extract_borders(mV0,lCollected); + Extract_borders(mV1,lCollected); } // @@ -140,12 +136,10 @@ void Edge_profile::Extract_borders( EdgeIdxMap const& edge_idx, EdgeIsBorde // the triangle, properly oriented, is added to mTriangles. // template -template void Edge_profile::Extract_triangle( vertex_descriptor const& v0 , vertex_descriptor const& v1 , vertex_descriptor const& v2 , edge_descriptor const& e02 - , EdgeIsBorderMap const& is_border ) { // The 3 vertices are obtained by circulating ccw around v0, that is, e02 = next_ccw(e01). @@ -157,7 +151,7 @@ void Edge_profile::Extract_triangle( vertex_descriptor const& v0 // The triangle is oriented v0->v2->v1. // In this case e02 is an edge of the facet. // If this facet edge is a border edge then this triangle is not in the mesh . - if ( !is_border[e02] ) + if ( ! e02->is_border() ) mTriangles.push_back(Triangle(v0,v2,v1) ) ; } else @@ -165,7 +159,7 @@ void Edge_profile::Extract_triangle( vertex_descriptor const& v0 // The triangle is oriented v0->v1->v2. // In this case, e20 and not e02, is an edge of the facet. // If this facet edge is a border edge then this triangle is not in the mesh . - if ( !is_border[opposite_edge(e02,surface_mesh())] ) + if ( ! opposite_edge(e02,surface_mesh())->is_border() ) mTriangles.push_back(Triangle(v0,v1,v2) ) ; } } @@ -174,13 +168,9 @@ void Edge_profile::Extract_triangle( vertex_descriptor const& v0 // Extract all triangles (its normals) and vertices (the link) around the collpasing edge p_q // template -template -void Edge_profile::Extract_triangles_and_link( VertexIdxMap const& - , EdgeIsBorderMap const& is_border - ) +void Edge_profile::Extract_triangles_and_link() { std::set lCollected ; - // // Extract around mV0, CCW // @@ -203,7 +193,7 @@ void Edge_profile::Extract_triangles_and_link( VertexIdxMap const& CGAL_assertion(lInserted); } - Extract_triangle(v0,v1,v2,e02,is_border); + Extract_triangle(v0,v1,v2,e02); v1 = v2 ; } @@ -234,7 +224,7 @@ void Edge_profile::Extract_triangles_and_link( VertexIdxMap const& if ( v2 != mV0 && lCollected.find(v2) == lCollected.end() ) mLink.push_back(v2) ; - Extract_triangle(v0,v1,v2,e02,is_border); + Extract_triangle(v0,v1,v2,e02); v1 = v2 ;