diff --git a/Mesh_2/examples/Mesh_2/mesh_optimization.cpp b/Mesh_2/examples/Mesh_2/mesh_optimization.cpp index 3d10e1e113d..1b23c60e7f5 100644 --- a/Mesh_2/examples/Mesh_2/mesh_optimization.cpp +++ b/Mesh_2/examples/Mesh_2/mesh_optimization.cpp @@ -49,7 +49,9 @@ int main() std::cout << "Number of vertices: " << cdt.number_of_vertices() << std::endl; std::cout << "Run Lloyd optimization..."; - CGAL::lloyd_optimize_mesh_2(cdt, 10); + CGAL::lloyd_optimize_mesh_2(cdt, + convergence = 0, + time_limit = 10); std::cout << " done." << std::endl; std::cout << "Number of vertices: " << cdt.number_of_vertices() << std::endl; diff --git a/Mesh_2/include/CGAL/lloyd_optimize_mesh_2.h b/Mesh_2/include/CGAL/lloyd_optimize_mesh_2.h index efe9247a3d6..4d4dfaca5a1 100644 --- a/Mesh_2/include/CGAL/lloyd_optimize_mesh_2.h +++ b/Mesh_2/include/CGAL/lloyd_optimize_mesh_2.h @@ -6,19 +6,52 @@ #include #include +#include +#include + +BOOST_PARAMETER_NAME( cdt ) +BOOST_PARAMETER_NAME( (max_iteration_number, tag) max_iteration_number_ ) +BOOST_PARAMETER_NAME( (convergence, tag) convergence_) +BOOST_PARAMETER_NAME( (time_limit, tag) time_limit_ ) +BOOST_PARAMETER_NAME( (freeze_bound, tag) freeze_bound_) + namespace CGAL { + BOOST_PARAMETER_FUNCTION( + (void), + lloyd_optimize_mesh_2, + tag, + (required (in_out(cdt),*)) + (optional + (max_iteration_number_, *, 0 ) + (convergence_, *, 0.001 ) + (time_limit_, *, 0. ) + (freeze_bound_, *, 0.001 ) + ) + ) + { + return lloyd_optimize_mesh_2_impl(cdt, + max_iteration_number_, + convergence_, + freeze_bound_, + time_limit_); + } template - void lloyd_optimize_mesh_2(CDT& cdt, - const unsigned int nb_iterations = 1, - const double convergence_ratio = 0.001) + void lloyd_optimize_mesh_2_impl(CDT& cdt, + const unsigned int max_iterations, + const double convergence_ratio, + const double freeze_bound, + const double time_limit) { typedef Mesh_2::Mesh_sizing_field Sizing; typedef Mesh_2::Lloyd_move_2 Mv; typedef Mesh_2::Mesh_global_optimizer_2 Optimizer; - Optimizer lloyd(cdt, convergence_ratio); + Optimizer lloyd(cdt, + convergence_ratio, + freeze_bound); + lloyd.set_time_limit(time_limit); #ifdef CGAL_MESH_2_OPTIMIZERS_DEBUG std::ofstream os("before_lloyd.angles.txt"); @@ -26,6 +59,11 @@ namespace CGAL os.close(); #endif + // 1000 iteration max to avoid infinite loop + int nb_iterations = (0 == max_iterations) + ? 1000 + : max_iterations; + //run optimization lloyd(nb_iterations);