diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp index 96325e6d861..1e1335ccfa6 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp @@ -20,8 +20,8 @@ int main(int argc, char* argv[]) return 1; } - const std::pair edge_min_max{0.1, 0.4}; - const double tol = 0.1; + //todo ip - update + const std::pair edge_min_max{0.1, 0.12}; unsigned int nb_iter = 3; std::cout << "Start remeshing of " << filename @@ -30,7 +30,6 @@ int main(int argc, char* argv[]) PMP::isotropic_remeshing( faces(mesh), edge_min_max, - tol, mesh, PMP::parameters::number_of_iterations(nb_iter) ); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index 6b48181388e..1293577ad4f 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -34,17 +34,22 @@ public: typedef typename Base::Point_3 Point_3; typedef typename Base::halfedge_descriptor halfedge_descriptor; typedef typename Base::vertex_descriptor vertex_descriptor; + typedef typename CGAL::dynamic_vertex_property_t Vertex_property_tag; + typedef typename boost::property_map::type VertexSizingMap; - Adaptive_sizing_field(const std::pair& edge_len_min_max - , const FT& tolerance - , const PolygonMesh& pmesh) + Adaptive_sizing_field(const std::pair& edge_len_min_max + , PolygonMesh& pmesh) : m_sq_short( CGAL::square(edge_len_min_max.first)) , m_sq_long( CGAL::square(edge_len_min_max.second)) - , tol(tolerance) , m_pmesh(pmesh) { - // calculate and store curvature and sizing field here in constructor? - // todo what about updating it? + //todo ip: initialize sizing map with default values + //todo ip: might end up using directly the property map of the curvature calculation (if mutable)? + vertex_sizing_map_ = get(Vertex_property_tag(), m_pmesh); + for(vertex_descriptor v : vertices(m_pmesh)){ + put(vertex_sizing_map_, v, m_sq_long); + } } private: @@ -62,10 +67,24 @@ private: } public: + void calc_sizing_map() + { + //todo ip + // calculate curvature + + // loop over curvature property field and calculate the target mesh size for a vertex + // don't forget to store squared length + + } + boost::optional is_too_long(const halfedge_descriptor& h) const { const FT sqlen = sqlength(h); - if(sqlen > m_sq_long) + FT sqtarg_len = std::min(get(vertex_sizing_map_, source(h, m_pmesh)), + get(vertex_sizing_map_, target(h, m_pmesh))); + CGAL_assertion(get(vertex_sizing_map_, source(h, m_pmesh))); + CGAL_assertion(get(vertex_sizing_map_, target(h, m_pmesh))); + if(sqlen > sqtarg_len) return sqlen; else return boost::none; @@ -75,7 +94,11 @@ public: const vertex_descriptor& vb) const { const FT sqlen = sqlength(va, vb); - if (sqlen > m_sq_long) + FT sqtarg_len = std::min(get(vertex_sizing_map_, va), + get(vertex_sizing_map_, vb)); + CGAL_assertion(get(vertex_sizing_map_, va)); + CGAL_assertion(get(vertex_sizing_map_, vb)); + if (sqlen > sqtarg_len) return sqlen; else return boost::none; @@ -84,7 +107,11 @@ public: boost::optional is_too_short(const halfedge_descriptor& h) const { const FT sqlen = sqlength(h); - if (sqlen < m_sq_long) + FT sqtarg_len = std::min(get(vertex_sizing_map_, source(h, m_pmesh)), + get(vertex_sizing_map_, target(h, m_pmesh))); + CGAL_assertion(get(vertex_sizing_map_, source(h, m_pmesh))); + CGAL_assertion(get(vertex_sizing_map_, target(h, m_pmesh))); + if (sqlen < sqtarg_len) return sqlen; else return boost::none; @@ -98,12 +125,18 @@ public: get(vpmap, source(h, m_pmesh))); } + void update_sizing_map(const vertex_descriptor& vnew) + { + //todo ip: calculate curvature for the vertex + //dummy + put(vertex_sizing_map_, vnew, m_sq_short); + } + private: FT m_sq_short; FT m_sq_long; - FT tol; - const PolygonMesh& m_pmesh; - //todo add property map containing sizing field form m_pmesh here + PolygonMesh& m_pmesh; + VertexSizingMap vertex_sizing_map_; }; }//end namespace Polygon_mesh_processing diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h index 3f32aacb1aa..fbb522b7c78 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h @@ -92,6 +92,8 @@ public: get(vpmap, source(h, m_pmesh))); } + void update_sizing_map(const vertex_descriptor& vnew) const {} //todo ip- rewrite to remove this? + private: FT m_sq_short; FT m_sq_long; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index f0daf9cc20a..19651ded9ae 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -478,7 +478,7 @@ namespace internal { //if an edge is longer than the given threshold `high`, the edge //is split at its midpoint and the two adjacent triangles are bisected (2-4 split)" template - void split_long_edges(const SizingFunction& sizing) + void split_long_edges(SizingFunction& sizing) { #ifdef CGAL_PMP_REMESHING_VERBOSE std::cout << "Split long edges..." << std::endl; @@ -536,6 +536,8 @@ namespace internal { //move refinement point vertex_descriptor vnew = target(hnew, mesh_); put(vpmap_, vnew, refinement_point); + //todo ip-add + sizing.update_sizing_map(vnew); #ifdef CGAL_PMP_REMESHING_VERY_VERBOSE std::cout << " Refinement point : " << refinement_point << std::endl; #endif @@ -1080,6 +1082,7 @@ namespace internal { Point proj = trees[patch_id_to_index_map[get_patch_id(face(halfedge(v, mesh_), mesh_))]]->closest_point(get(vpmap_, v)); put(vpmap_, v, proj); + //todo ip - also update sizing field here? } CGAL_assertion(!input_mesh_is_valid_ || is_valid_polygon_mesh(mesh_)); #ifdef CGAL_PMP_REMESHING_DEBUG @@ -1108,6 +1111,7 @@ namespace internal { continue; //note if v is constrained, it has not moved put(vpmap_, v, proj(v)); + //todo ip: also update sizing field here? } CGAL_assertion(is_valid(mesh_)); #ifdef CGAL_PMP_REMESHING_DEBUG @@ -2010,6 +2014,7 @@ private: VertexIsConstrainedMap vcmap_; FaceIndexMap fimap_; CGAL_assertion_code(bool input_mesh_is_valid_;) + //todo ip: maybe make sizing field member (reference) here? easier to handle updates };//end class Incremental_remesher }//end namespace internal diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 4ba686e9e19..858f3495810 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -38,7 +38,7 @@ template void isotropic_remeshing(const FaceRange& faces - , const SizingFunction& sizing + , SizingFunction& sizing , PolygonMesh& pmesh , const NamedParameters& np); @@ -224,14 +224,14 @@ template void isotropic_remeshing(const FaceRange& faces , const std::pair& edge_len_min_max //todo add defaults? - , const double& tolerance //todo add defaults? , PolygonMesh& pmesh , const NamedParameters& np = parameters::default_values()) { typedef Adaptive_sizing_field Adaptive_sizing; + Adaptive_sizing sizing(edge_len_min_max, pmesh); isotropic_remeshing( faces, - Adaptive_sizing(edge_len_min_max, tolerance, pmesh), + sizing, pmesh, np); } @@ -241,7 +241,7 @@ template void isotropic_remeshing(const FaceRange& faces - , const SizingFunction& sizing + , SizingFunction& sizing , PolygonMesh& pmesh , const NamedParameters& np) {