Change tolerance as it becomes pretty slow

This commit is contained in:
Andreas Fabri 2020-09-10 11:02:43 +01:00
parent f31b7fe4e1
commit a308ff89bb
1 changed files with 27 additions and 5 deletions

View File

@ -1,5 +1,6 @@
#include <CGAL/Simple_cartesian.h> #include <CGAL/Simple_cartesian.h>
#include <CGAL/Surface_mesh.h> #include <CGAL/Surface_mesh.h>
#include <CGAL/Timer.h>
// Simplification function // Simplification function
#include <CGAL/Surface_mesh_simplification/edge_collapse.h> #include <CGAL/Surface_mesh_simplification/edge_collapse.h>
@ -34,9 +35,9 @@ int main(int argc, char** argv)
std::ifstream is(argc > 1 ? argv[1] : "data/helmet.off"); std::ifstream is(argc > 1 ? argv[1] : "data/helmet.off");
is >> ref_mesh; is >> ref_mesh;
SMS::Count_stop_predicate<Surface> stop(10); SMS::Count_stop_predicate<Surface> stop(num_halfedges(ref_mesh)/10);
std::cout << "input has " << num_vertices(ref_mesh) << " vertices." << std::endl; std::cout << "Input has " << num_vertices(ref_mesh) << " vertices and " << num_edges(ref_mesh) << " edges" << std::endl;
CGAL::Iso_cuboid_3<Kernel> bbox(CGAL::Polygon_mesh_processing::bbox(ref_mesh)); CGAL::Iso_cuboid_3<Kernel> bbox(CGAL::Polygon_mesh_processing::bbox(ref_mesh));
Point_3 cmin = (bbox.min)(); Point_3 cmin = (bbox.min)();
@ -46,26 +47,47 @@ int main(int argc, char** argv)
Surface mesh_cpy = ref_mesh; // need a copy to keep the AABB tree valid Surface mesh_cpy = ref_mesh; // need a copy to keep the AABB tree valid
Surface small_mesh = ref_mesh; Surface small_mesh = ref_mesh;
Surface big_mesh = ref_mesh; Surface big_mesh = ref_mesh;
Surface huge_mesh = ref_mesh;
CGAL::Timer t;
t.start();
Placement placement_ref; Placement placement_ref;
SMS::edge_collapse(ref_mesh, stop, CGAL::parameters::get_cost(Cost()).get_placement(placement_ref)); SMS::edge_collapse(ref_mesh, stop, CGAL::parameters::get_cost(Cost()).get_placement(placement_ref));
std::cout << "Output has " << vertices(ref_mesh).size() << " vertices and " << edges(ref_mesh).size() << " edges" << std::endl;
std::cout << t.time() << "sec\n";
t.reset();
std::cout << "eps = " << 0.00005*diag << std::endl;
Filtered_placement placement_small(0.00005*diag, placement_ref); Filtered_placement placement_small(0.00005*diag, placement_ref);
SMS::edge_collapse(small_mesh, stop, CGAL::parameters::get_cost(Cost()).get_placement(placement_small)); SMS::edge_collapse(small_mesh, stop, CGAL::parameters::get_cost(Cost()).get_placement(placement_small));
std::cout << "Output has " << vertices(small_mesh).size() << " vertices and " << edges(small_mesh).size() << " edges" << std::endl;
std::cout << t.time() << "sec\n";
t.reset();
Filtered_placement placement_big(0.1, placement_ref); // lazily builds the AABB tree std::cout << "eps = " << 0.0001*diag << std::endl;
Filtered_placement placement_big(0.0001, placement_ref);
SMS::edge_collapse(big_mesh, stop, CGAL::parameters::get_cost(Cost()).get_placement(placement_big)); SMS::edge_collapse(big_mesh, stop, CGAL::parameters::get_cost(Cost()).get_placement(placement_big));
std::cout << "Output has " << vertices(big_mesh).size() << " vertices and " << edges(big_mesh).size() << " edges" << std::endl;
std::cout << t.time() << "sec\n";
std::ofstream out("out.off"); std::cout << "eps = " << 0.0002*diag << std::endl;
Filtered_placement placement_huge(0.0002, placement_ref);
SMS::edge_collapse(huge_mesh, stop, CGAL::parameters::get_cost(Cost()).get_placement(placement_huge));
std::cout << "Output has " << vertices(huge_mesh).size() << " vertices and " << edges(huge_mesh).size() << " edges" << std::endl;
std::cout << t.time() << "sec\n";
std::ofstream out("big.off");
out << big_mesh << std::endl; out << big_mesh << std::endl;
out.close(); out.close();
std::cout << "no filtering: " << vertices(ref_mesh).size() << " vertices left" << std::endl; std::cout << "no filtering: " << vertices(ref_mesh).size() << " vertices left" << std::endl;
std::cout << "huge filtering distance: " << vertices(huge_mesh).size() << " vertices left" << std::endl;
std::cout << "large filtering distance: " << vertices(big_mesh).size() << " vertices left" << std::endl; std::cout << "large filtering distance: " << vertices(big_mesh).size() << " vertices left" << std::endl;
std::cout << "small filtering distance: " << vertices(small_mesh).size() << " vertices left" << std::endl; std::cout << "small filtering distance: " << vertices(small_mesh).size() << " vertices left" << std::endl;
assert(vertices(ref_mesh).size() < vertices(small_mesh).size()); assert(vertices(ref_mesh).size() < vertices(small_mesh).size());
assert(vertices(big_mesh).size() < vertices(small_mesh).size()); assert(vertices(huge_mesh).size() < vertices(small_mesh).size());
assert(vertices(ref_mesh).size() < vertices(big_mesh).size()); assert(vertices(ref_mesh).size() < vertices(big_mesh).size());
return EXIT_SUCCESS; return EXIT_SUCCESS;