massaging the examples as desired (do not compile)

added todo list
This commit is contained in:
Pierre Alliez 2017-11-14 18:12:18 +01:00
parent 86e6a2af7c
commit 7f515a63d4
6 changed files with 113 additions and 38 deletions

View File

@ -0,0 +1,6 @@
Examples:
- free function for approximation, with only indexed triangles as output
- free function for approximation, with polyhedron set as output
- free function for segmentation, with segmentation as output
- class interface
-

View File

@ -14,7 +14,7 @@ int main()
{ {
// create polyhedral surface and read input surface triangle mesh // create polyhedral surface and read input surface triangle mesh
Polyhedron input; Polyhedron input;
std::ifstream file("data/bear.off"); std::ifstream file("data/mask.off");
if (!file || !(file >> input) || input.empty()) { if (!file || !(file >> input) || input.empty()) {
std::cerr << "Invalid off file." << std::endl; std::cerr << "Invalid off file." << std::endl;
return EXIT_FAILURE; return EXIT_FAILURE;
@ -23,19 +23,19 @@ int main()
// output polyhedral surface and indexed triangle mesh // output polyhedral surface and indexed triangle mesh
Polyhedron output; Polyhedron output;
std::vector<std::size_t> triangles; std::vector<std::size_t> triangles;
std::vector<Kernel::Point_3> anchors; std::vector<Kernel::Point_3> points;
// free function interface with named parameters // free function interface with named parameters
bool valid_polyhedron = CGAL::VSA::mesh_approximation(input, bool valid_polyhedron = CGAL::VSA::mesh_approximation(input,
CGAL::VSA::parameters::init_method(CGAL::Hierarchical). // hierarchical init CGAL::VSA::parameters::init_method(CGAL::VSA::Hierarchical). // hierarchical init
refine_until(200). // refine until target number of proxies refine_until_proxies(200). // refine until target number of proxies
iterations(30). // number of relaxation iterations after seeding iterations(30). // number of relaxation iterations after seeding
anchor_points(std::back_inserter(anchors)). // get anchor vertices anchor_points(std::back_inserter(points)). // get anchor points
indexed_triangles(std::back_inserter(triangles)). // get indexed triangles indexed_triangles(std::back_inserter(triangles)). // get indexed triangles
output); // output to polyhedron, if 2-manifold and oriented output); // output to polyhedron, if 2-manifold and oriented
std::cout << "#anchor vertices: " << anchors.size() << std::endl; std::cout << "#anchor points: " << points.size() << std::endl;
std::cout << "#triangles: " << triangles.size() << std::endl; std::cout << "#triangles: " << triangles.size() / 3 << std::endl;
if (valid_polyhedron) if (valid_polyhedron)
std::cout << "oriented 2-manifold output." << std::endl; std::cout << "oriented 2-manifold output." << std::endl;

View File

@ -13,52 +13,52 @@ typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
typedef boost::property_map<Polyhedron, boost::vertex_point_t>::type VertexPointMap; typedef boost::property_map<Polyhedron, boost::vertex_point_t>::type VertexPointMap;
typedef CGAL::VSA_approximation<Polyhedron, VertexPointMap> VSA; typedef CGAL::VSA::Mesh_approximation<Polyhedron, VertexPointMap> Mesh_approximation;
// default L21 metric // L21 error metric
typedef VSA::ErrorMetric L21_metric; typedef VSA::L21_error_metric Metric;
typedef VSA::ProxyFitting L21_proxy_fitting; typedef VSA::L21_proxy_fitting Proxy_fitting;
int main() int main()
{ {
// create polyhedral surface and read input mesh // create polyhedral surface and read input mesh
Polyhedron input; Polyhedron input;
std::ifstream file("data/bear.off"); std::ifstream file("data/mask.off");
if (!file || !(file >> input) || input.empty()) { if (!file || !(file >> input) || input.empty()) {
std::cerr << "Invalid off file." << std::endl; std::cerr << "Invalid off file." << std::endl;
return EXIT_FAILURE; return EXIT_FAILURE;
} }
// create VSA approximation algorithm instance // create VSA approximation algorithm instance
VSA l21_approx(input, Mesh_approximation approx(input,
get(boost::vertex_point, const_cast<Polyhedron &>(input))); get(boost::vertex_point, const_cast<Polyhedron &>(input)));
// set error and fitting functors // set error and fitting functors
L21_metric metric(input); Metric metric(input);
L21_proxy_fitting proxy_fitting(input); Proxy_fitting proxy_fitting(input);
l21_approx.set_metric(metric, proxy_fitting); approx.set_metric(metric, proxy_fitting);
// initialize 100 random proxies // initialize 100 random proxies
l21_approx.init_by_number(CGAL::Random, 100); approx.init_by_number(CGAL::Random, 100);
// run 30 iterations to reduce the approximation error // run 30 iterations
for (std::size_t i = 0; i < 30; ++i) approx.run(30);
l21_approx.run_one_step();
// add proxies to the one with the maximum fitting error // add 3 proxies to the one with the maximum fitting error
// and run 10 iterations // run 5 iterations between each addition
l21_approx.add_proxies_furthest(3, 5); approx.add_proxies_furthest(3, 5);
for (std::size_t i = 0; i < 10; ++i)
l21_approx.run_one_step();
// teleport 2 proxies from local minima // run 10 iterations
l21_approx.teleport_proxies(2); approx.run(10);
for (std::size_t i = 0; i < 10; ++i)
l21_approx.run_one_step(); // teleport 2 proxies to tunnel out of local minima
// run 5 iterations between each teleport
l21_approx.teleport_proxies(2, 5);
approx.run(10);
// mesh and output final polyhedral surface // mesh and output final polyhedral surface
Polyhedron output; Polyhedron output;
l21_approx.extract_mesh(output); approx.meshing(output);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@ -24,7 +24,7 @@ typedef boost::associative_property_map<std::map<Facet_handle, FT> > FacetAreaMa
typedef boost::associative_property_map<std::map<Facet_handle, Point> > FacetCenterMap; typedef boost::associative_property_map<std::map<Facet_handle, Point> > FacetCenterMap;
// use point as proxy // use point as proxy
typedef Point PointProxy; typedef Point PointProxy; // TOFIX: CGAL capitalization -> Point_proxy (everywhere)
// user-defined "compact" error metric // user-defined "compact" error metric
struct CompactMetric { struct CompactMetric {
@ -71,8 +71,9 @@ struct PointProxyFitting {
const FacetCenterMap center_pmap; const FacetCenterMap center_pmap;
const FacetAreaMap area_pmap; const FacetAreaMap area_pmap;
}; };
typedef CGAL::VSA_approximation<Polyhedron, VertexPointMap,
CompactMetric, PointProxyFitting> CompactVSA; typedef CGAL::VSA::Mesh_approximation<Polyhedron, VertexPointMap,
CompactMetric, PointProxyFitting> Approximation;
int main() int main()
{ {
@ -101,18 +102,17 @@ int main()
FacetCenterMap center_pmap(facet_centers); FacetCenterMap center_pmap(facet_centers);
// create compact metric approximation algorithm instance // create compact metric approximation algorithm instance
CompactVSA compact_approx(input, Approximation approx(input,
get(boost::vertex_point, const_cast<Polyhedron &>(input))); get(boost::vertex_point, const_cast<Polyhedron &>(input)));
// construct metric and fitting functors // construct metric and fitting functors
CompactMetric metric(center_pmap); CompactMetric metric(center_pmap);
PointProxyFitting proxy_fitting(center_pmap, area_pmap); PointProxyFitting proxy_fitting(center_pmap, area_pmap);
compact_approx.set_metric(metric, proxy_fitting); approx.set_metric(metric, proxy_fitting);
// approximation via 200 proxies and 30 iterations // approximation via 200 proxies and 30 iterations
compact_approx.init_by_number(CGAL::Hierarchical, 200); approx.init_by_number(CGAL::Hierarchical, 200);
for (std::size_t i = 0; i < 30; ++i) approx.run(30);
compact_approx.run_one_step();
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@ -0,0 +1,30 @@
#include <iostream>
#include <fstream>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/vsa_mesh_approximation.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
int main()
{
// create polyhedral surface and read input surface triangle mesh
Polyhedron input;
std::ifstream file("data/mask.off");
if (!file || !(file >> input) || input.empty()) {
std::cerr << "Invalid off file." << std::endl;
return EXIT_FAILURE;
}
// free function interface with named parameters
CGAL::VSA::mesh_segmentation(input,
CGAL::VSA::parameters::init_method(CGAL::VSA::Hierarchical). // hierarchical init
refine_until(200). // refine until target number of proxies
iterations(30)); // number of relaxation iterations after seeding
return EXIT_SUCCESS;
}

View File

@ -0,0 +1,39 @@
#include <iostream>
#include <fstream>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/vsa_mesh_approximation.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
int main()
{
// create polyhedral surface and read input surface triangle mesh
Polyhedron input;
std::ifstream file("data/mask.off");
if (!file || !(file >> input) || input.empty()) {
std::cerr << "Invalid off file." << std::endl;
return EXIT_FAILURE;
}
// output polyhedral surface and indexed triangle mesh
std::vector<std::size_t> triangles;
std::vector<Kernel::Point_3> points;
// free function interface with named parameters
bool valid_polyhedron = CGAL::VSA::mesh_approximation(input,
CGAL::VSA::parameters::init_method(CGAL::VSA::Hierarchical). // hierarchical init
refine_until_proxies(200). // refine until target number of proxies
iterations(30). // number of relaxation iterations after seeding
anchor_points(std::back_inserter(points)). // get anchor points
indexed_triangles(std::back_inserter(triangles))); // get indexed triangles
std::cout << "#anchor points: " << points.size() << std::endl;
std::cout << "#triangles: " << triangles.size() / 3 << std::endl;
return EXIT_SUCCESS;
}