mirror of https://github.com/CGAL/cgal
Improve GH example
This commit is contained in:
parent
854b6dd5b2
commit
a2c13412b3
|
|
@ -4,13 +4,11 @@
|
||||||
#include <CGAL/Surface_mesh_simplification/edge_collapse.h>
|
#include <CGAL/Surface_mesh_simplification/edge_collapse.h>
|
||||||
#include <CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Count_ratio_stop_predicate.h>
|
#include <CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Count_ratio_stop_predicate.h>
|
||||||
#include <CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_placement.h>
|
#include <CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_placement.h>
|
||||||
#include <CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_plane_policies.h>
|
#include <CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_policies.h>
|
||||||
#include <CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_triangle_policies.h>
|
|
||||||
#include <CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_probabilistic_plane_policies.h>
|
|
||||||
#include <CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_probabilistic_triangle_policies.h>
|
|
||||||
|
|
||||||
#include <CGAL/Polygon_mesh_processing/measure.h>
|
#include <CGAL/Polygon_mesh_processing/measure.h>
|
||||||
#include <CGAL/Polygon_mesh_processing/distance.h>
|
#include <CGAL/Polygon_mesh_processing/distance.h>
|
||||||
|
#include <CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.h>
|
||||||
|
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
|
|
@ -60,20 +58,26 @@ Surface_mesh edge_collapse(Surface_mesh& mesh,
|
||||||
{
|
{
|
||||||
typedef typename Policy::Get_cost Cost;
|
typedef typename Policy::Get_cost Cost;
|
||||||
typedef typename Policy::Get_placement Placement;
|
typedef typename Policy::Get_placement Placement;
|
||||||
|
|
||||||
typedef SMS::Bounded_normal_change_placement<Placement> Bounded_placement;
|
typedef SMS::Bounded_normal_change_placement<Placement> Bounded_placement;
|
||||||
|
|
||||||
|
std::cout << "Edge collapse mesh of " << num_edges(mesh) << " edges. Policy: " << typeid(Policy).name() << std::endl;
|
||||||
|
|
||||||
const Policy p { mesh, 100 };
|
const Policy p { mesh, 100 };
|
||||||
|
|
||||||
const Cost& cost = p.get_cost();
|
const Cost& cost = p.get_cost();
|
||||||
const Placement& unbounded_placement = p.get_placement();
|
const Placement& unbounded_placement = p.get_placement();
|
||||||
|
Bounded_placement bounded_placement(unbounded_placement);
|
||||||
Bounded_placement placement(unbounded_placement);
|
|
||||||
|
|
||||||
SMS::Count_ratio_stop_predicate<Surface_mesh> stop(ratio);
|
SMS::Count_ratio_stop_predicate<Surface_mesh> stop(ratio);
|
||||||
|
|
||||||
// collapse edges ignoring result code
|
auto start_time = std::chrono::steady_clock::now();
|
||||||
SMS::edge_collapse(mesh, stop, CGAL::parameters::get_cost(cost).get_placement(placement));
|
|
||||||
|
SMS::edge_collapse(mesh, stop, CGAL::parameters::get_cost(cost)
|
||||||
|
.get_placement(unbounded_placement));
|
||||||
|
|
||||||
|
auto end_time = std::chrono::steady_clock::now();
|
||||||
|
|
||||||
|
unsigned long elapsed_ns = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count();
|
||||||
|
std::cout << "Elapsed: " << std::to_string(elapsed_ns) << '\n';
|
||||||
|
|
||||||
return mesh;
|
return mesh;
|
||||||
}
|
}
|
||||||
|
|
@ -120,13 +124,15 @@ void time_all_vector(const fs::path& output_file,
|
||||||
bool read_from_file(const fs::path& p,
|
bool read_from_file(const fs::path& p,
|
||||||
Surface_mesh& mesh)
|
Surface_mesh& mesh)
|
||||||
{
|
{
|
||||||
fs::ifstream in { p };
|
|
||||||
|
|
||||||
// make sure the mesh is empty and ready for the next set of data
|
// make sure the mesh is empty and ready for the next set of data
|
||||||
mesh.clear();
|
clear(mesh);
|
||||||
|
|
||||||
if(!in || !(in >> mesh))
|
std::string filename = fs::canonical(p).string();
|
||||||
|
if(!CGAL::IO::read_polygon_mesh(filename, mesh))
|
||||||
|
{
|
||||||
|
std::cerr << "Failed to read input: " << filename << std::endl;
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -191,7 +197,8 @@ void time_policy(const fs::path& dir, const fs::path& output_file)
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Policy>
|
template <typename Policy>
|
||||||
double hausdorff_error(const Surface_mesh& mesh, double ratio = 0.2)
|
double hausdorff_error(const Surface_mesh& mesh,
|
||||||
|
double ratio = 0.2)
|
||||||
{
|
{
|
||||||
// an arbitrarily chosen small value
|
// an arbitrarily chosen small value
|
||||||
constexpr double error_bound = 0.00001;
|
constexpr double error_bound = 0.00001;
|
||||||
|
|
@ -281,18 +288,18 @@ void gather_face_aspect_ratio(const fs::path& file, const fs::path& out)
|
||||||
read_from_file(file, pt);
|
read_from_file(file, pt);
|
||||||
|
|
||||||
edge_collapse<Classic_plane>(cp);
|
edge_collapse<Classic_plane>(cp);
|
||||||
edge_collapse<Prob_plane>(pp);
|
|
||||||
edge_collapse<Classic_tri>(ct);
|
edge_collapse<Classic_tri>(ct);
|
||||||
|
edge_collapse<Prob_plane>(pp);
|
||||||
edge_collapse<Prob_tri>(pt);
|
edge_collapse<Prob_tri>(pt);
|
||||||
|
|
||||||
fs::ofstream out_stream { out };
|
fs::ofstream out_stream { out };
|
||||||
|
|
||||||
out_stream << "classic_plane\n";
|
out_stream << "classic_plane\n";
|
||||||
write_aspect_ratios(out_stream, cp);
|
write_aspect_ratios(out_stream, cp);
|
||||||
out_stream << "prob_plane\n";
|
|
||||||
write_aspect_ratios(out_stream, pp);
|
|
||||||
out_stream << "classic_tri\n";
|
out_stream << "classic_tri\n";
|
||||||
write_aspect_ratios(out_stream, ct);
|
write_aspect_ratios(out_stream, ct);
|
||||||
|
out_stream << "prob_plane\n";
|
||||||
|
write_aspect_ratios(out_stream, pp);
|
||||||
out_stream << "prob_tri\n";
|
out_stream << "prob_tri\n";
|
||||||
write_aspect_ratios(out_stream, pt);
|
write_aspect_ratios(out_stream, pt);
|
||||||
}
|
}
|
||||||
|
|
@ -303,10 +310,10 @@ void time_policy_string(const fs::path& in, const fs::path& out, const std::stri
|
||||||
{
|
{
|
||||||
if(policy == "classic_plane")
|
if(policy == "classic_plane")
|
||||||
time_policy<Classic_plane>(in, out);
|
time_policy<Classic_plane>(in, out);
|
||||||
else if(policy == "prob_plane")
|
|
||||||
time_policy<Prob_plane>(in, out);
|
|
||||||
else if(policy == "classic_tri")
|
else if(policy == "classic_tri")
|
||||||
time_policy<Classic_tri>(in, out);
|
time_policy<Classic_tri>(in, out);
|
||||||
|
else if(policy == "prob_plane")
|
||||||
|
time_policy<Prob_plane>(in, out);
|
||||||
else if(policy == "prob_tri")
|
else if(policy == "prob_tri")
|
||||||
time_policy<Prob_tri>(in, out);
|
time_policy<Prob_tri>(in, out);
|
||||||
}
|
}
|
||||||
|
|
@ -326,7 +333,7 @@ int main(int argc, char* argv[])
|
||||||
|
|
||||||
if(argc != 5)
|
if(argc != 5)
|
||||||
{
|
{
|
||||||
std::cerr << "Expected 3 arugments to time: [input_dir] [output_file] [policy].\n";
|
std::cerr << "Expected 3 arguments to time: [input_dir] [output_file] [policy].\n";
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -336,7 +343,7 @@ int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
m = Mode::hausdorff_ratio;
|
m = Mode::hausdorff_ratio;
|
||||||
}
|
}
|
||||||
else if(input == "mesh")
|
else if(input == "hausdorff")
|
||||||
{
|
{
|
||||||
m = Mode::hausdorff_mesh;
|
m = Mode::hausdorff_mesh;
|
||||||
}
|
}
|
||||||
|
|
@ -348,34 +355,31 @@ int main(int argc, char* argv[])
|
||||||
std::cerr << "Expected 1 (2) argument(s) to run: [input_file] [ratio].\n";
|
std::cerr << "Expected 1 (2) argument(s) to run: [input_file] [ratio].\n";
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// default init empty mesh
|
// default init empty mesh
|
||||||
Surface_mesh sm;
|
Surface_mesh sm;
|
||||||
|
|
||||||
FT ratio = 0.2;
|
|
||||||
if(argc == 4) {
|
|
||||||
ratio = std::stod(argv[3]);
|
|
||||||
}
|
|
||||||
|
|
||||||
read_from_file(argv[2], sm);
|
read_from_file(argv[2], sm);
|
||||||
|
|
||||||
|
const FT ratio = (argc > 3) ? std::stod(argv[3]) : 0.2;
|
||||||
|
|
||||||
Surface_mesh cp = sm;
|
Surface_mesh cp = sm;
|
||||||
Surface_mesh pp = sm;
|
|
||||||
Surface_mesh ct = sm;
|
Surface_mesh ct = sm;
|
||||||
|
Surface_mesh pp = sm;
|
||||||
Surface_mesh pt = sm;
|
Surface_mesh pt = sm;
|
||||||
|
|
||||||
edge_collapse<Classic_plane>(cp, ratio);
|
edge_collapse<Classic_plane>(cp, ratio);
|
||||||
edge_collapse<Prob_plane>(pp, ratio);
|
|
||||||
edge_collapse<Classic_tri>(ct, ratio);
|
edge_collapse<Classic_tri>(ct, ratio);
|
||||||
|
edge_collapse<Prob_plane>(pp, ratio);
|
||||||
edge_collapse<Prob_tri>(pt, ratio);
|
edge_collapse<Prob_tri>(pt, ratio);
|
||||||
|
|
||||||
fs::ofstream classic_plane_stream {"run_classic_plane.off"};
|
fs::ofstream classic_plane_stream {"run_classic_plane.off"};
|
||||||
fs::ofstream prob_plane_stream {"run_prob_plane.off"};
|
|
||||||
fs::ofstream classic_tri_stream {"run_classic_tri.off"};
|
fs::ofstream classic_tri_stream {"run_classic_tri.off"};
|
||||||
|
fs::ofstream prob_plane_stream {"run_prob_plane.off"};
|
||||||
fs::ofstream prob_tri_stream {"run_prob_tri.off"};
|
fs::ofstream prob_tri_stream {"run_prob_tri.off"};
|
||||||
|
|
||||||
classic_plane_stream << cp;
|
classic_plane_stream << cp;
|
||||||
prob_plane_stream << pp;
|
|
||||||
classic_tri_stream << ct;
|
classic_tri_stream << ct;
|
||||||
|
prob_plane_stream << pp;
|
||||||
prob_tri_stream << pt;
|
prob_tri_stream << pt;
|
||||||
}
|
}
|
||||||
else if(input == "aspect")
|
else if(input == "aspect")
|
||||||
|
|
@ -385,7 +389,7 @@ int main(int argc, char* argv[])
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::cerr << "Didn't recognise command line argument " << input <<
|
std::cerr << "Didn't recognise command line argument " << input <<
|
||||||
"(options are time, ratio or mesh)\n";
|
"(options are \"time\", \"run\", \"ratio\", \"aspect\", or \"hausdorff\")\n";
|
||||||
|
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue