diff --git a/Surface_mesh_approximation/benchmark/Surface_mesh_approximation/vsa_autoinit_timing_benchmark.cpp b/Surface_mesh_approximation/benchmark/Surface_mesh_approximation/vsa_autoinit_timing_benchmark.cpp index 2369bd97bbd..58914737c34 100644 --- a/Surface_mesh_approximation/benchmark/Surface_mesh_approximation/vsa_autoinit_timing_benchmark.cpp +++ b/Surface_mesh_approximation/benchmark/Surface_mesh_approximation/vsa_autoinit_timing_benchmark.cpp @@ -38,14 +38,14 @@ int main(int argc, char *argv[]) } std::cerr << "#triangles " << mesh.size_of_facets() << std::endl; - // algorithm instance - L21_approx approx(mesh, - get(boost::vertex_point, const_cast(mesh))); - - // set metric error and fitting functors + // error metric and fitting functors L21_metric error_metric(mesh, get(boost::vertex_point, const_cast(mesh))); - approx.set_metric(error_metric); + + // algorithm instance + L21_approx approx(mesh, + get(boost::vertex_point, const_cast(mesh)), + error_metric); int method = std::atoi(argv[2]); if (method < 0 || method > 2) diff --git a/Surface_mesh_approximation/benchmark/Surface_mesh_approximation/vsa_timing_benchmark.cpp b/Surface_mesh_approximation/benchmark/Surface_mesh_approximation/vsa_timing_benchmark.cpp index 2aeddfdc2cd..bcb7d3f270b 100644 --- a/Surface_mesh_approximation/benchmark/Surface_mesh_approximation/vsa_timing_benchmark.cpp +++ b/Surface_mesh_approximation/benchmark/Surface_mesh_approximation/vsa_timing_benchmark.cpp @@ -39,14 +39,14 @@ int main(int argc, char *argv[]) } std::cerr << "#triangles " << mesh.size_of_facets() << std::endl; - // algorithm instance - L21_apporx approx(mesh, - get(boost::vertex_point, const_cast(mesh))); - - // set metric error and fitting functors + // error metric and fitting functors L21_metric error_metric(mesh, get(boost::vertex_point, const_cast(mesh))); - approx.set_metric(error_metric); + + // algorithm instance + L21_apporx approx(mesh, + get(boost::vertex_point, const_cast(mesh)), + error_metric); int method = std::atoi(argv[2]); if (method < 0 || method > 2) diff --git a/Surface_mesh_approximation/examples/Surface_mesh_approximation/vsa_class_interface_example.cpp b/Surface_mesh_approximation/examples/Surface_mesh_approximation/vsa_class_interface_example.cpp index 9beca8097b1..4d1f0fe125f 100644 --- a/Surface_mesh_approximation/examples/Surface_mesh_approximation/vsa_class_interface_example.cpp +++ b/Surface_mesh_approximation/examples/Surface_mesh_approximation/vsa_class_interface_example.cpp @@ -24,14 +24,14 @@ int main() return EXIT_FAILURE; } - // creates VSA algorithm instance - Mesh_approximation approx(input, + // error metric and fitting function + L21_metric error_metric(input, get(boost::vertex_point, const_cast(input))); - // sets error and fitting functors - L21_metric metric(input, - get(boost::vertex_point, const_cast(input))); - approx.set_metric(metric); + // creates VSA algorithm instance + Mesh_approximation approx(input, + get(boost::vertex_point, const_cast(input)), + error_metric); // seeds 100 random proxies approx.initialize_seeds(CGAL::VSA::Random, 100); diff --git a/Surface_mesh_approximation/examples/Surface_mesh_approximation/vsa_isotropic_metric_example.cpp b/Surface_mesh_approximation/examples/Surface_mesh_approximation/vsa_isotropic_metric_example.cpp index 04fa4f3001f..dc347e135c7 100644 --- a/Surface_mesh_approximation/examples/Surface_mesh_approximation/vsa_isotropic_metric_example.cpp +++ b/Surface_mesh_approximation/examples/Surface_mesh_approximation/vsa_isotropic_metric_example.cpp @@ -91,13 +91,13 @@ int main() Face_area_map area_pmap(face_areas); Face_center_map center_pmap(face_centers); + // error metric and fitting function + Compact_metric_point_proxy error_metric(center_pmap, area_pmap); + // creates compact metric approximation algorithm instance Approximation approx(input, - get(boost::vertex_point, const_cast(input))); - - // constructs and set metric - Compact_metric_point_proxy metric(center_pmap, area_pmap); - approx.set_metric(metric); + get(boost::vertex_point, const_cast(input)), + error_metric); // approximates via 200 proxies and 30 iterations approx.initialize_seeds(CGAL::VSA::Hierarchical, 200); diff --git a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h index 922fca48686..2d0840d7552 100644 --- a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h +++ b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h @@ -278,31 +278,17 @@ public: /// \name Construction /// @{ /*! - * @brief %Default empty constructor. - */ - Variational_shape_approximation() : - m_ptm(NULL), - m_metric(NULL), - m_average_edge_length(0.0) { - - Geom_traits traits; - vector_functor = traits.construct_vector_3_object(); - point_functor = traits.construct_point_3_object(); - scale_functor = traits.construct_scaled_vector_3_object(); - sum_functor = traits.construct_sum_of_vectors_3_object(); - scalar_product_functor = traits.compute_scalar_product_3_object(); - translate_point_functor = traits.construct_translated_point_3_object(); - } - - /*! - * @brief Initializes and prepares for the approximation. - * @param tm `CGAL TriangleMesh` on which approximation operates. + * @brief Initializes internal data for the approximation. + * @param tm `CGAL TriangleMesh` on which approximation operates * @param vpoint_map vertex point map of the mesh + * @param error_metric an `ErrorMetricProxy` object */ - Variational_shape_approximation(const TriangleMesh &tm, const VertexPointMap &vpoint_map) : + Variational_shape_approximation(const TriangleMesh &tm, + const VertexPointMap &vpoint_map, + const Error_metric &error_metric) : m_ptm(&tm), m_vpoint_map(vpoint_map), - m_metric(NULL), + m_metric(&error_metric), m_average_edge_length(0.0) { Geom_traits traits; diff --git a/Surface_mesh_approximation/include/CGAL/approximate_mesh.h b/Surface_mesh_approximation/include/CGAL/approximate_mesh.h index e3882ae04ef..0853535bee2 100644 --- a/Surface_mesh_approximation/include/CGAL/approximate_mesh.h +++ b/Surface_mesh_approximation/include/CGAL/approximate_mesh.h @@ -128,9 +128,8 @@ bool approximate_mesh(const TriangleMesh &tm, const NamedParameters &np) << "\n#v " << num_vertices(tm) << std::endl; } - L21_approx approx(tm, point_pmap); L21_metric metric(tm, point_pmap); - approx.set_metric(metric); + L21_approx approx(tm, point_pmap, metric); // hierarchical seeding by default CGAL::VSA::Seeding_method method = choose_param( diff --git a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_class_interface_test.cpp b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_class_interface_test.cpp index 64a07cf1cf7..62ea674b649 100644 --- a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_class_interface_test.cpp +++ b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_class_interface_test.cpp @@ -44,11 +44,11 @@ int main() // create L2_approx L2 metric approximation algorithm instance std::cout << "setup algorithm instance" << std::endl; - L2_approx approx(mesh, - get(boost::vertex_point, const_cast(mesh))); L2_metric_plane_proxy error_metric(mesh, get(boost::vertex_point, const_cast(mesh))); - approx.set_metric(error_metric); + L2_approx approx(mesh, + get(boost::vertex_point, const_cast(mesh)), + error_metric); // random seeding and run std::cout << "random seeding and run" << std::endl; diff --git a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_correctness_test.cpp b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_correctness_test.cpp index e58def0ca92..33bdac565a2 100644 --- a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_correctness_test.cpp +++ b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_correctness_test.cpp @@ -27,12 +27,11 @@ bool test_shape(const char *file_name, const std::size_t target_num_proxies) std::cout << "Testing \"" << file_name << '\"' << std::endl; // algorithm instance - L21_approx approx(mesh, - get(boost::vertex_point, const_cast(mesh))); - L21_metric error_metric(mesh, get(boost::vertex_point, const_cast(mesh))); - approx.set_metric(error_metric); + L21_approx approx(mesh, + get(boost::vertex_point, const_cast(mesh)), + error_metric); // approximation, seeding from error, drop to the target error incrementally // should reach targeted number of proxies gradually diff --git a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_error_decrease_test.cpp b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_error_decrease_test.cpp index f98db73f928..66090340ea7 100644 --- a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_error_decrease_test.cpp +++ b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_error_decrease_test.cpp @@ -43,12 +43,11 @@ int main() } // algorithm instance - L21_approx approx(mesh, - get(boost::vertex_point, const_cast(mesh))); - L21_metric error_metric(mesh, get(boost::vertex_point, const_cast(mesh))); - approx.set_metric(error_metric); + L21_approx approx(mesh, + get(boost::vertex_point, const_cast(mesh)), + error_metric); approx.initialize_seeds(CGAL::VSA::Random, 100); std::vector error; diff --git a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_meshing_manifold_test.cpp b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_meshing_manifold_test.cpp index e5347672812..fed60812945 100644 --- a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_meshing_manifold_test.cpp +++ b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_meshing_manifold_test.cpp @@ -27,12 +27,11 @@ bool test_manifold(const char *file_name, const FT drop = FT(1e-8)) std::cout << "Testing \"" << file_name << '\"' << std::endl; // algorithm instance - L21_approx approx(mesh, - get(boost::vertex_point, const_cast(mesh))); - L21_metric error_metric(mesh, get(boost::vertex_point, const_cast(mesh))); - approx.set_metric(error_metric); + L21_approx approx(mesh, + get(boost::vertex_point, const_cast(mesh)), + error_metric); // approximation, seeding from error, drop to the target error incrementally const std::size_t num_iterations = 20; diff --git a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_metric_test.cpp b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_metric_test.cpp index 8fc3b9e0f99..820d5b35570 100644 --- a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_metric_test.cpp +++ b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_metric_test.cpp @@ -92,11 +92,11 @@ int main() // create compact metric approximation algorithm instance std::cout << "create compact vas instance" << std::endl; - Compact_approx approx(mesh, - get(boost::vertex_point, const_cast(mesh))); - Compact_metric_point_proxy error_metric(center_pmap, area_pmap); - approx.set_metric(error_metric); + + Compact_approx approx(mesh, + get(boost::vertex_point, const_cast(mesh)), + error_metric); std::cout << "random seeding and run" << std::endl; approx.initialize_seeds(CGAL::VSA::Random, 20); diff --git a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_teleportation_test.cpp b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_teleportation_test.cpp index 0e3e7ef6295..3a84da168fd 100644 --- a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_teleportation_test.cpp +++ b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_teleportation_test.cpp @@ -62,8 +62,8 @@ int main() L21_metric error_metric(mesh, get(boost::vertex_point, const_cast(mesh))); L21_approx approx(mesh, - get(boost::vertex_point, const_cast(mesh))); - approx.set_metric(error_metric); + get(boost::vertex_point, const_cast(mesh)), + error_metric); std::cout << "Random seeding by number." << std::endl; std::srand(static_cast(std::time(0)));