Skip to content

Instantly share code, notes, and snippets.

@pentacular
Created August 11, 2023 08:57
Show Gist options
  • Save pentacular/c02a8dea2a74006716a41c618e700d4c to your computer and use it in GitHub Desktop.
Save pentacular/c02a8dea2a74006716a41c618e700d4c to your computer and use it in GitHub Desktop.
#define CGAL_USE_GLPK
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/GLPK_mixed_integer_program_traits.h>
#include <CGAL/Polygonal_surface_reconstruction.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/property_map.h>
int main() {
typedef CGAL::Exact_predicates_inexact_constructions_kernel Epick_kernel;
typedef Epick_kernel::Point_3 Epick_point;
typedef Epick_kernel::Vector_3 Epick_vector;
typedef CGAL::Surface_mesh<Epick_point> Epick_surface_mesh;
typedef boost::tuple<Epick_point, Epick_vector, int> PNI;
typedef CGAL::Nth_of_tuple_property_map<0, PNI> Point_map;
typedef CGAL::Nth_of_tuple_property_map<1, PNI> Normal_map;
typedef CGAL::Nth_of_tuple_property_map<2, PNI> Plane_id_map;
typedef std::vector<PNI> Point_vector;
Point_vector points{
PNI(Epick_point(0.5, 0.5, -1.5), Epick_vector(0, 0, -1), 0),
PNI(Epick_point(1.5, -1.5, -1.5), Epick_vector(0, 0, -1), 0),
PNI(Epick_point(-1.5, 1.5, -1.5), Epick_vector(0, 0, -1), 0),
PNI(Epick_point(1.5, 1.5, -1.5), Epick_vector(0, 0, -1), 0),
PNI(Epick_point(-0.5, -0.5, -1.5), Epick_vector(0, 0, -1), 0),
PNI(Epick_point(-1.5, -1.5, -1.5), Epick_vector(0, 0, -1), 0),
PNI(Epick_point(-1.5, 1.5, -1.5), Epick_vector(0, 0, -1), 0),
PNI(Epick_point(1.5, -1.5, -1.5), Epick_vector(0, 0, -1), 0),
PNI(Epick_point(0.5, 0.5, 1.5), Epick_vector(0, 0, 1), 1),
PNI(Epick_point(1.5, 1.5, 1.5), Epick_vector(0, 0, 1), 1),
PNI(Epick_point(-1.5, 1.5, 1.5), Epick_vector(0, 0, 1), 1),
PNI(Epick_point(1.5, -1.5, 1.5), Epick_vector(0, 0, 1), 1),
PNI(Epick_point(-0.5, -0.5, 1.5), Epick_vector(0, 0, 1), 1),
PNI(Epick_point(1.5, -1.5, 1.5), Epick_vector(0, 0, 1), 1),
PNI(Epick_point(-1.5, 1.5, 1.5), Epick_vector(0, 0, 1), 1),
PNI(Epick_point(-1.5, -1.5, 1.5), Epick_vector(0, 0, 1), 1),
PNI(Epick_point(1.5, 0.5, 0.5), Epick_vector(1, 0, 0), 2),
PNI(Epick_point(1.5, 1.5, -1.5), Epick_vector(1, 0, 0), 2),
PNI(Epick_point(1.5, 1.5, 1.5), Epick_vector(1, 0, 0), 2),
PNI(Epick_point(1.5, -1.5, 1.5), Epick_vector(1, 0, 0), 2),
PNI(Epick_point(1.5, -0.5, -0.5), Epick_vector(1, 0, 0), 2),
PNI(Epick_point(1.5, -1.5, 1.5), Epick_vector(1, 0, 0), 2),
PNI(Epick_point(1.5, -1.5, -1.5), Epick_vector(1, 0, 0), 2),
PNI(Epick_point(1.5, 1.5, -1.5), Epick_vector(1, 0, 0), 2),
PNI(Epick_point(-0.5, 1.5, 0.5), Epick_vector(0, 1, 0), 3),
PNI(Epick_point(-1.5, 1.5, -1.5), Epick_vector(0, 1, 0), 3),
PNI(Epick_point(-1.5, 1.5, 1.5), Epick_vector(0, 1, 0), 3),
PNI(Epick_point(1.5, 1.5, 1.5), Epick_vector(0, 1, 0), 3),
PNI(Epick_point(0.5, 1.5, -0.5), Epick_vector(0, 1, 0), 3),
PNI(Epick_point(1.5, 1.5, 1.5), Epick_vector(0, 1, 0), 3),
PNI(Epick_point(1.5, 1.5, -1.5), Epick_vector(0, 1, 0), 3),
PNI(Epick_point(-1.5, 1.5, -1.5), Epick_vector(0, 1, 0), 3),
PNI(Epick_point(-1.5, -0.5, 0.5), Epick_vector(-1, 0, 0), 4),
PNI(Epick_point(-1.5, -1.5, -1.5), Epick_vector(-1, 0, 0), 4),
PNI(Epick_point(-1.5, -1.5, 1.5), Epick_vector(-1, 0, 0), 4),
PNI(Epick_point(-1.5, 1.5, 1.5), Epick_vector(-1, 0, 0), 4),
PNI(Epick_point(-1.5, 0.5, -0.5), Epick_vector(-1, 0, 0), 4),
PNI(Epick_point(-1.5, 1.5, 1.5), Epick_vector(-1, 0, 0), 4),
PNI(Epick_point(-1.5, 1.5, -1.5), Epick_vector(-1, 0, 0), 4),
PNI(Epick_point(-1.5, -1.5, -1.5), Epick_vector(-1, 0, 0), 4),
PNI(Epick_point(0.5, -1.5, 0.5), Epick_vector(0, -1, 0), 5),
PNI(Epick_point(1.5, -1.5, -1.5), Epick_vector(0, -1, 0), 5),
PNI(Epick_point(1.5, -1.5, 1.5), Epick_vector(0, -1, 0), 5),
PNI(Epick_point(-1.5, -1.5, 1.5), Epick_vector(0, -1, 0), 5),
PNI(Epick_point(-0.5, -1.5, -0.5), Epick_vector(0, -1, 0), 5),
PNI(Epick_point(-1.5, -1.5, 1.5), Epick_vector(0, -1, 0), 5),
PNI(Epick_point(-1.5, -1.5, -1.5), Epick_vector(0, -1, 0), 5),
PNI(Epick_point(1.5, -1.5, -1.5), Epick_vector(0, -1, 0), 5)
};
typedef CGAL::Polygonal_surface_reconstruction<Epick_kernel>
Polygonal_surface_reconstruction;
typedef CGAL::GLPK_mixed_integer_program_traits<double> MIP_Solver;
Polygonal_surface_reconstruction algo(points, Point_map(), Normal_map(),
Plane_id_map());
Epick_surface_mesh mesh;
if (!algo.reconstruct<MIP_Solver>(mesh)) {
std::cerr << " Failed: " << algo.error_message() << std::endl;
return 1;
}
std::cout << "Reconstructed mesh is closed: " << CGAL::is_closed(mesh) << std::endl;
std::cout << "Reconstructed mesh: " << mesh << std::endl;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment