diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/area_smoothing_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/area_smoothing_example.cpp index efa91957db4..f4465d7d2f4 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/area_smoothing_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/area_smoothing_example.cpp @@ -17,7 +17,7 @@ int main(int argc, char* argv[]){ std::cout<<"hello\n"; - const char* filename = "data/polygon.off"; + const char* filename = "data/polygon3D.off"; std::ifstream input(filename); Mesh mesh; @@ -28,11 +28,11 @@ int main(int argc, char* argv[]){ - CGAL::Polygon_mesh_processing::area_remeshing(mesh, CGAL::Polygon_mesh_processing::parameters::all_default()); + CGAL::Polygon_mesh_processing::area_remeshing(mesh, CGAL::Polygon_mesh_processing::parameters::all_default(), faces(mesh)); - std::ofstream output("data/area_smoothed_polygon.off"); + std::ofstream output("data/area_smoothed_polygon3D.off"); output << mesh; output.close(); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/area_smoothing.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/area_smoothing.h index 9cb660982ec..72bf3511ed7 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/area_smoothing.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/area_smoothing.h @@ -5,10 +5,17 @@ #include #include +//#include + #include #include -#include +#include +//#include + + +#include + namespace CGAL { @@ -18,6 +25,10 @@ namespace Polygon_mesh_processing { + + + + template class Area_remesher { @@ -28,11 +39,15 @@ class Area_remesher typedef typename GeomTraits::Point_3 Point; typedef typename GeomTraits::Vector_3 Vector; + typedef typename GeomTraits::Triangle_3 Triangle; + + + //typedef CGAL::AABB_face_graph_triangle_primitive Primitive; + //typedef CGAL::AABB_traits Traits; + //typedef CGAL::AABB_tree Tree; + - typedef CGAL::AABB_face_graph_triangle_primitive Primitive; - typedef CGAL::AABB_traits Traits; - typedef CGAL::AABB_tree Tree; @@ -44,13 +59,12 @@ public: - void area_relaxation() { - Tree tree(faces(mesh_).first, faces(mesh_).second, mesh_); + //Tree tree(faces(mesh_).first, faces(mesh_).second, mesh_); //tree.rebuild(faces(mesh_).first, faces(mesh_).second, mesh_);// - tree.accelerate_distance_queries(); + //tree.accelerate_distance_queries(); @@ -67,15 +81,15 @@ public: - std::cout<<"point before projection: "< -void area_remeshing(PolygonMesh& pmesh, const NamedParameters& np) + + + + + + + +template +void area_remeshing(PolygonMesh& pmesh, const NamedParameters& np, const FaceRange& faces) { @@ -298,13 +327,80 @@ void area_remeshing(PolygonMesh& pmesh, const NamedParameters& np) typedef typename GetGeomTraits::type GeomTraits; + //bool do_project = choose_param(get_param(np, internal_np::do_project), true); + + + //typedef PolygonMesh PM; + using PM = PolygonMesh; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + using boost::get_param; + using boost::choose_param; + + + typedef typename GetGeomTraits::type GT; + + //typedef typename GetVertexPointMap::type VPMap; + //VPMap vpmap = choose_param(get_param(np, internal_np::vertex_point), + // get_property_map(vertex_point, pmesh)); + + typedef typename GetFaceIndexMap::type FIMap; + FIMap fimap = choose_param(get_param(np, internal_np::face_index), + get_property_map(face_index, pmesh)); + + typedef typename boost::lookup_named_param_def < + internal_np::edge_is_constrained_t, + NamedParameters, + internal::Border_constraint_pmap//default + > ::type ECMap; + ECMap ecmap = (boost::is_same >::value) + //avoid constructing the Border_constraint_pmap if it's not used + ? choose_param(get_param(np, internal_np::edge_is_constrained) + , internal::Border_constraint_pmap(pmesh, faces, fimap)) + : choose_param(get_param(np, internal_np::edge_is_constrained) + , internal::Border_constraint_pmap()); + + typedef typename boost::lookup_named_param_def < + internal_np::vertex_is_constrained_t, + NamedParameters, + internal::No_constraint_pmap//default + > ::type VCMap; + VCMap vcmap = choose_param(get_param(np, internal_np::vertex_is_constrained), + internal::No_constraint_pmap()); + + typedef typename boost::lookup_named_param_def < + internal_np::face_patch_t, + NamedParameters, + internal::Connected_components_pmap//default + > ::type FPMap; + FPMap fpmap = (boost::is_same >::value) + ? choose_param(get_param(np, internal_np::face_patch), + internal::Connected_components_pmap(pmesh, ecmap, fimap)) + : choose_param(get_param(np, internal_np::face_patch), + internal::Connected_components_pmap());//do not compute cc's + + bool protect = choose_param(get_param(np, internal_np::protect_constraints), false); + + + + + + + CGAL::Polygon_mesh_processing::internal::Incremental_remesher + inc_remesher(pmesh, vpmap, protect, ecmap, vcmap, fpmap, fimap); + inc_remesher.init_remeshing(faces); + + CGAL::Polygon_mesh_processing::Area_remesher remesher(pmesh, vpmap); remesher.area_relaxation(); + inc_remesher.project_to_surface(); + + + }