introduce freezing of vertices that do not move enough

This commit is contained in:
Jane Tournois 2014-11-18 10:48:23 +01:00
parent 338a9593f7
commit b2edb9d20b
2 changed files with 35 additions and 12 deletions

View File

@ -51,7 +51,8 @@ int main()
std::cout << "Run Lloyd optimization..."; std::cout << "Run Lloyd optimization...";
CGAL::lloyd_optimize_mesh_2(cdt, CGAL::lloyd_optimize_mesh_2(cdt,
convergence = 0, convergence = 0,
time_limit = 10); freeze_bound = 0.005,
time_limit = 0);
std::cout << " done." << std::endl; std::cout << " done." << std::endl;
std::cout << "Number of vertices: " << cdt.number_of_vertices() << std::endl; std::cout << "Number of vertices: " << cdt.number_of_vertices() << std::endl;

View File

@ -121,6 +121,9 @@ public:
moving_vertices.size()/200); moving_vertices.size()/200);
big_moves_.resize(big_moves_size, FT(0)); big_moves_.resize(big_moves_size, FT(0));
std::size_t nb_vertices_moved = -1;
bool convergence_stop = false;
// Iterate // Iterate
int i = -1; int i = -1;
while ( ++i < nb_iterations && ! is_time_limit_reached() ) while ( ++i < nb_iterations && ! is_time_limit_reached() )
@ -130,14 +133,25 @@ public:
// Compute move for each vertex // Compute move for each vertex
Moves_vector moves = compute_moves(moving_vertices); Moves_vector moves = compute_moves(moving_vertices);
//Pb with Freeze : sometimes a few vertices continue moving indefinitely
//if the nb of moving vertices is < 2% of total nb AND does not decrease
if(sq_freeze_ratio_ > 0.
&& nb_vertices_moved < 0.01 * initial_vertices_nb
&& nb_vertices_moved == moving_vertices.size())
{
// we should stop because we are
// probably entering an infinite instable loop
convergence_stop = true;
break;
}
// Stop if convergence or time_limit is reached // Stop if convergence or time_limit is reached
if ( check_convergence() || is_time_limit_reached() ) if ( check_convergence() || is_time_limit_reached() )
break; break;
// Update mesh with those moves // Update mesh with those moves
update_mesh(moves, moving_vertices); update_mesh(moves, moving_vertices);
nb_vertices_moved = moving_vertices.size();
// ToDo : freeze vertices that do not move enough
move_function_.after_move(cdt_); move_function_.after_move(cdt_);
@ -162,7 +176,11 @@ public:
#ifdef CGAL_MESH_2_OPTIMIZER_VERBOSE #ifdef CGAL_MESH_2_OPTIMIZER_VERBOSE
running_time_.stop(); running_time_.stop();
std::cerr << std::endl; std::cerr << std::endl;
if ( is_time_limit_reached() ) if(sq_freeze_ratio_ > 0. && moving_vertices.empty())
std::cerr << "All vertices frozen" << std::endl;
else if(sq_freeze_ratio_ > 0. && convergence_stop)
std::cerr << "Can't improve anymore" << std::endl;
else if ( is_time_limit_reached() )
std::cerr << "Time limit reached" << std::endl; std::cerr << "Time limit reached" << std::endl;
else if ( check_convergence() ) else if ( check_convergence() )
std::cerr << "Convergence reached" << std::endl; std::cerr << "Convergence reached" << std::endl;
@ -178,7 +196,7 @@ private:
/** /**
* Returns moves for vertices of set \c moving_vertices * Returns moves for vertices of set \c moving_vertices
*/ */
Moves_vector compute_moves(const Vertex_set& moving_vertices) Moves_vector compute_moves(Vertex_set& moving_vertices)
{ {
typename Gt::Construct_translated_point_2 translate = typename Gt::Construct_translated_point_2 translate =
Gt().construct_translated_point_2_object(); Gt().construct_translated_point_2_object();
@ -188,19 +206,23 @@ private:
moves.reserve(moving_vertices.size()); moves.reserve(moving_vertices.size());
// reset worst_move list // reset worst_move list
std::fill(big_moves_.begin(),big_moves_.end(),FT(0)); std::fill(big_moves_.begin(), big_moves_.end(), FT(0));
// Get move for each moving vertex // Get move for each moving vertex
for ( typename Vertex_set::const_iterator vit = moving_vertices.begin() ; for ( typename Vertex_set::const_iterator vit = moving_vertices.begin() ;
vit != moving_vertices.end() ; vit != moving_vertices.end() ; )
++vit )
{ {
Vector_2 move = compute_move(*vit); Vertex_handle oldv = *vit;
Vector_2 move = compute_move(oldv);
++vit;
if ( CGAL::NULL_VECTOR != move ) if ( CGAL::NULL_VECTOR != move )
{ {
Point_2 new_position = translate((*vit)->point(), move); Point_2 new_position = translate(oldv->point(), move);
moves.push_back(std::make_pair(*vit,new_position)); moves.push_back(std::make_pair(oldv, new_position));
} }
else if(sq_freeze_ratio_ > 0.) //freezing ON
moving_vertices.erase(oldv);
// Stop if time_limit_ is reached // Stop if time_limit_ is reached
if ( is_time_limit_reached() ) if ( is_time_limit_reached() )