Simplify volume check in make_manifold()

This commit is contained in:
Mael Rouxel-Labbé 2023-10-16 10:18:01 +02:00
parent 76aeec9805
commit 8f3cc5c86b
1 changed files with 43 additions and 41 deletions

View File

@ -324,53 +324,18 @@ public:
if(do_enforce_manifoldness) if(do_enforce_manifoldness)
{ {
#ifdef CGAL_AW3_DEBUG
extract_surface(output_mesh, ovpm, true /*tolerate non manifoldness*/);
#ifdef CGAL_AW3_DEBUG_DUMP_EVERY_STEP
dump_triangulation_faces("carved_tr.off", false /*only_boundary_faces*/);
IO::write_polygon_mesh("carved_wrap.off", output_mesh,
CGAL::parameters::vertex_point_map(ovpm).stream_precision(17));
#endif
FT base_vol = 0;
if(is_closed(output_mesh)) // might not be due to manifoldness
base_vol = PMP::volume(output_mesh, CGAL::parameters::vertex_point_map(ovpm));
else
std::cerr << "Warning: couldn't compute volume before manifoldness fixes (mesh is not closed)" << std::endl;
#endif
make_manifold(); make_manifold();
#ifdef CGAL_AW3_DEBUG_DUMP_INTERMEDIATE_WRAPS
dump_triangulation_faces("manifold_wrap.off", true /*only_boundary_faces*/);
#endif
#ifdef CGAL_AW3_TIMER #ifdef CGAL_AW3_TIMER
t.stop(); t.stop();
std::cout << "Manifoldness post-processing took: " << t.time() << " s." << std::endl; std::cout << "Manifoldness post-processing took: " << t.time() << " s." << std::endl;
t.reset(); t.reset();
t.start(); t.start();
#endif #endif
#ifdef CGAL_AW3_DEBUG
if(!is_zero(base_vol))
{
extract_surface(output_mesh, ovpm, false /*do not tolerate non-manifoldness*/);
const FT manifold_vol = PMP::volume(output_mesh, CGAL::parameters::vertex_point_map(ovpm));
const FT ratio = manifold_vol / base_vol;
std::cout << "Volumes post-manifoldness fix:\n"
<< "before: " << base_vol << "\n"
<< "after: " << manifold_vol << "\n"
<< "ratio: " << ratio << std::endl;
if(ratio > 1.1) // more than 10% extra volume
std::cerr << "Warning: large increase of volume after manifoldness resolution" << std::endl;
}
std::size_t nm_cells_counter = 0;
for(Cell_handle ch : m_tr.all_cell_handles())
if(ch->label() == Cell_label::MANIFOLD)
++nm_cells_counter;
std::cout << "Number of added cells: " << nm_cells_counter << std::endl;
#endif
} }
extract_surface(output_mesh, ovpm, !do_enforce_manifoldness); extract_surface(output_mesh, ovpm, !do_enforce_manifoldness);
@ -1655,10 +1620,26 @@ public:
// Not the best complexity, but it's very cheap compared to the rest of the algorithm. // Not the best complexity, but it's very cheap compared to the rest of the algorithm.
void make_manifold() void make_manifold()
{ {
namespace PMP = Polygon_mesh_processing;
#ifdef CGAL_AW3_DEBUG #ifdef CGAL_AW3_DEBUG
std::cout << "> Make manifold..." << std::endl; std::cout << "> Make manifold..." << std::endl;
auto wrap_volume = [&]()
{
FT vol = 0;
for(Cell_handle ch : m_tr.all_cell_handles())
if(!ch->is_outside())
vol += volume(m_tr.point(ch, 0), m_tr.point(ch, 1), m_tr.point(ch, 2), m_tr.point(ch, 3));
return vol;
};
#ifdef CGAL_AW3_DEBUG_DUMP_INTERMEDIATE_WRAPS
dump_triangulation_faces("carved_tr.off", true /*only_boundary_faces*/);
#endif
FT base_vol = wrap_volume();
if(!is_positive(base_vol))
std::cerr << "Warning: empty wrap?" << std::endl;
#endif #endif
// This seems more harmful than useful after the priority queue has been introduced since // This seems more harmful than useful after the priority queue has been introduced since
@ -1813,6 +1794,27 @@ public:
CGAL_assertion_code(for(Vertex_handle v : m_tr.finite_vertex_handles())) CGAL_assertion_code(for(Vertex_handle v : m_tr.finite_vertex_handles()))
CGAL_assertion(!is_non_manifold(v)); CGAL_assertion(!is_non_manifold(v));
#ifdef CGAL_AW3_DEBUG
std::size_t nm_cells_counter = 0;
for(Cell_handle ch : m_tr.all_cell_handles())
if(ch->label() == Cell_label::MANIFOLD)
++nm_cells_counter;
std::cout << "Number of added cells: " << nm_cells_counter << std::endl;
if(!is_zero(base_vol))
{
const FT manifold_vol = wrap_volume();
const FT ratio = manifold_vol / base_vol;
std::cout << "Volumes post-manifoldness fix:\n"
<< "before: " << base_vol << "\n"
<< "after: " << manifold_vol << "\n"
<< "ratio: " << ratio << std::endl;
if(ratio > 1.1) // more than 10% extra volume
std::cerr << "Warning: large increase of volume after manifoldness resolution" << std::endl;
}
#endif
} }
private: private: