mirror of https://github.com/CGAL/cgal
introduce freezing of vertices that do not move enough
This commit is contained in:
parent
338a9593f7
commit
b2edb9d20b
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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() )
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue