mirror of https://github.com/CGAL/cgal
improve example by using CGAL functions
This commit is contained in:
parent
cec720a69c
commit
def8ebda4b
|
|
@ -2,6 +2,7 @@
|
||||||
#include <CGAL/Surface_mesh.h>
|
#include <CGAL/Surface_mesh.h>
|
||||||
|
|
||||||
#include <CGAL/Polygon_mesh_processing/triangulate_hole.h>
|
#include <CGAL/Polygon_mesh_processing/triangulate_hole.h>
|
||||||
|
#include <CGAL/Polygon_mesh_processing/border.h>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
@ -17,30 +18,23 @@ typedef boost::graph_traits<Mesh>::face_descriptor face_descriptor;
|
||||||
typedef boost::graph_traits<Mesh>::vertex_descriptor vertex_descriptor;
|
typedef boost::graph_traits<Mesh>::vertex_descriptor vertex_descriptor;
|
||||||
|
|
||||||
bool is_small_hole(halfedge_descriptor h, Mesh & mesh,
|
bool is_small_hole(halfedge_descriptor h, Mesh & mesh,
|
||||||
std::set<Point> & examined_points,
|
|
||||||
double max_hole_diam, int max_num_hole_edges)
|
double max_hole_diam, int max_num_hole_edges)
|
||||||
{
|
{
|
||||||
int num_hole_edges = 0;
|
int num_hole_edges = 0;
|
||||||
auto cvpm = CGAL::get_const_property_map(CGAL::vertex_point, mesh);
|
|
||||||
CGAL::Halfedge_around_face_circulator<Mesh> circ(h, mesh), done(circ);
|
|
||||||
CGAL::Bbox_3 hole_bbox;
|
CGAL::Bbox_3 hole_bbox;
|
||||||
|
for (halfedge_descriptor hc : CGAL::halfedges_around_face(h, mesh))
|
||||||
|
{
|
||||||
|
const Point& p = mesh.point(target(hc, mesh));
|
||||||
|
|
||||||
do {
|
hole_bbox += p.bbox();
|
||||||
Point p = get(cvpm, target(*circ, mesh));
|
++num_hole_edges;
|
||||||
|
|
||||||
if (examined_points.find(p) != examined_points.end())
|
|
||||||
return false;
|
|
||||||
examined_points.insert(p);
|
|
||||||
|
|
||||||
hole_bbox += CGAL::Bbox_3(p.x(), p.y(), p.z(), p.x(), p.y(), p.z());
|
|
||||||
num_hole_edges++;
|
|
||||||
|
|
||||||
// Exit early, to avoid unnecessary traversal of large holes
|
// Exit early, to avoid unnecessary traversal of large holes
|
||||||
if (num_hole_edges > max_num_hole_edges) return false;
|
if (num_hole_edges > max_num_hole_edges) return false;
|
||||||
if (hole_bbox.xmax() - hole_bbox.xmin() > max_hole_diam) return false;
|
if (hole_bbox.xmax() - hole_bbox.xmin() > max_hole_diam) return false;
|
||||||
if (hole_bbox.ymax() - hole_bbox.ymin() > max_hole_diam) return false;
|
if (hole_bbox.ymax() - hole_bbox.ymin() > max_hole_diam) return false;
|
||||||
if (hole_bbox.zmax() - hole_bbox.zmin() > max_hole_diam) return false;
|
if (hole_bbox.zmax() - hole_bbox.zmin() > max_hole_diam) return false;
|
||||||
} while (++circ != done);
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -63,36 +57,31 @@ int main(int argc, char* argv[])
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Avoid examining a hole we studied before using a different half edge.
|
|
||||||
std::set<Point> examined_points;
|
|
||||||
|
|
||||||
unsigned int nb_holes = 0;
|
unsigned int nb_holes = 0;
|
||||||
for(halfedge_descriptor h : halfedges(mesh))
|
std::vector<halfedge_descriptor> border_cycles;
|
||||||
|
|
||||||
|
// collect one halfedge per boundary cycle
|
||||||
|
CGAL::Polygon_mesh_processing::extract_boundary_cycles(mesh, std::back_inserter(border_cycles));
|
||||||
|
|
||||||
|
for(halfedge_descriptor h : border_cycles)
|
||||||
{
|
{
|
||||||
if(is_border(h,mesh))
|
if(max_hole_diam > 0 && max_num_hole_edges > 0 &&
|
||||||
{
|
!is_small_hole(h, mesh, max_hole_diam, max_num_hole_edges))
|
||||||
|
continue;
|
||||||
|
|
||||||
if(max_hole_diam > 0 && max_num_hole_edges > 0 &&
|
std::vector<face_descriptor> patch_facets;
|
||||||
!is_small_hole(h, mesh, examined_points,
|
std::vector<vertex_descriptor> patch_vertices;
|
||||||
max_hole_diam, max_num_hole_edges))
|
bool success = std::get<0>(
|
||||||
continue;
|
CGAL::Polygon_mesh_processing::triangulate_refine_and_fair_hole(
|
||||||
|
mesh,
|
||||||
|
h,
|
||||||
|
std::back_inserter(patch_facets),
|
||||||
|
std::back_inserter(patch_vertices)) );
|
||||||
|
|
||||||
std::vector<face_descriptor> patch_facets;
|
std::cout << "* Number of facets in constructed patch: " << patch_facets.size() << std::endl;
|
||||||
std::vector<vertex_descriptor> patch_vertices;
|
std::cout << " Number of vertices in constructed patch: " << patch_vertices.size() << std::endl;
|
||||||
bool success = std::get<0>(
|
std::cout << " Is fairing successful: " << success << std::endl;
|
||||||
CGAL::Polygon_mesh_processing::triangulate_refine_and_fair_hole(
|
++nb_holes;
|
||||||
mesh,
|
|
||||||
h,
|
|
||||||
std::back_inserter(patch_facets),
|
|
||||||
std::back_inserter(patch_vertices),
|
|
||||||
CGAL::Polygon_mesh_processing::parameters::vertex_point_map(get(CGAL::vertex_point, mesh)).
|
|
||||||
geom_traits(Kernel())) );
|
|
||||||
|
|
||||||
std::cout << "* Number of facets in constructed patch: " << patch_facets.size() << std::endl;
|
|
||||||
std::cout << " Number of vertices in constructed patch: " << patch_vertices.size() << std::endl;
|
|
||||||
std::cout << " Is fairing successful: " << success << std::endl;
|
|
||||||
nb_holes++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue