mirror of https://github.com/CGAL/cgal
Complete array-based polygon soup reparation: remove more invalid faces
This commit is contained in:
parent
585d0dc3dd
commit
6cdf3f256f
|
|
@ -345,6 +345,66 @@ std::size_t remove_invalid_polygons_in_polygon_soup(PointRange& /*points*/,
|
||||||
return removed_polygons_n;
|
return removed_polygons_n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// \ingroup PMP_repairing_grp
|
||||||
|
//
|
||||||
|
// Removes invalid array-based polygons, i.e. polygons which have two equal consecutive points.
|
||||||
|
//
|
||||||
|
// \tparam PointRange a model of the concept `Container` whose value type is the point type.
|
||||||
|
// \tparam PolygonRange a model of the concept `SequenceContainer`
|
||||||
|
// whose value_type is `std::array<std::size_t, N>` with `N`.
|
||||||
|
// \tparam NamedParameters a sequence of \ref pmp_namedparameters "Named Parameters"
|
||||||
|
//
|
||||||
|
// \param points points of the soup of polygons.
|
||||||
|
// \param polygons a vector of polygons. Each element in the vector describes a polygon
|
||||||
|
// using the indices of the points in `points`.
|
||||||
|
//
|
||||||
|
template <typename Traits, typename PointRange, typename PolygonRange>
|
||||||
|
std::size_t remove_invalid_polygons_in_array_polygon_soup(PointRange& points,
|
||||||
|
PolygonRange& polygons,
|
||||||
|
const Traits& traits = Traits())
|
||||||
|
{
|
||||||
|
typedef typename internal::Polygon_types<PointRange, PolygonRange>::Polygon_3 Polygon_3;
|
||||||
|
|
||||||
|
std::vector<std::size_t> to_remove;
|
||||||
|
const std::size_t ini_polygons_size = polygons.size();
|
||||||
|
for(std::size_t polygon_index=0; polygon_index!=ini_polygons_size; ++polygon_index)
|
||||||
|
{
|
||||||
|
const Polygon_3& polygon = polygons[polygon_index];
|
||||||
|
const std::size_t N = polygon.size(), last = N-1;
|
||||||
|
CGAL_assertion(N > 2);
|
||||||
|
|
||||||
|
for(std::size_t i=0; i<N; ++i)
|
||||||
|
{
|
||||||
|
const std::size_t next_i = (i == last) ? 0 : i+1;
|
||||||
|
if(polygon[i] == polygon[next_i] || // combinatorial equality
|
||||||
|
traits.equal_3_object()(points[polygon[i]], points[polygon[next_i]])) // geometric equality
|
||||||
|
{
|
||||||
|
#ifdef CGAL_PMP_REPAIR_POLYGON_SOUP_VERBOSE_PP
|
||||||
|
std::cout << "Invalid polygon:";
|
||||||
|
print_polygon(std::cout, polygons[polygon_index]);
|
||||||
|
#endif
|
||||||
|
to_remove.push_back(polygon_index);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while(!to_remove.empty())
|
||||||
|
{
|
||||||
|
polygons.erase(polygons.begin() + to_remove.back());
|
||||||
|
to_remove.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::size_t removed_polygons_n = ini_polygons_size - polygons.size();
|
||||||
|
|
||||||
|
#ifdef CGAL_PMP_REPAIR_POLYGON_SOUP_VERBOSE
|
||||||
|
if(removed_polygons_n > 0)
|
||||||
|
std::cout << "Removed " << removed_polygons_n << " invalid polygon(s)" << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return removed_polygons_n;
|
||||||
|
}
|
||||||
|
|
||||||
} // end namespace internal
|
} // end namespace internal
|
||||||
|
|
||||||
/// \ingroup PMP_repairing_grp
|
/// \ingroup PMP_repairing_grp
|
||||||
|
|
@ -1031,15 +1091,21 @@ struct Polygon_soup_fixer<PointRange, PolygonRange, std::array<PID, N> >
|
||||||
PolygonRange& polygons,
|
PolygonRange& polygons,
|
||||||
const NamedParameters& np) const
|
const NamedParameters& np) const
|
||||||
{
|
{
|
||||||
#ifdef CGAL_PMP_REPAIR_POLYGON_SOUP_VERBOSE
|
using parameters::get_parameter;
|
||||||
|
using parameters::choose_parameter;
|
||||||
|
|
||||||
|
typedef typename GetPolygonGeomTraits<PointRange, PolygonRange, NamedParameters>::type Traits;
|
||||||
|
Traits traits = choose_parameter(get_parameter(np, internal_np::geom_traits), Traits());
|
||||||
|
|
||||||
|
#ifdef CGAL_PMP_REPAIR_POLYGON_SOUP_VERBOSE
|
||||||
std::cout << "Repairing soup with " << points.size() << " points and " << polygons.size() << " arrays" << std::endl;
|
std::cout << "Repairing soup with " << points.size() << " points and " << polygons.size() << " arrays" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
merge_duplicate_points_in_polygon_soup(points, polygons, np);
|
merge_duplicate_points_in_polygon_soup(points, polygons, np);
|
||||||
// skipped steps:
|
// skipped steps:
|
||||||
// simplify_polygons_in_polygon_soup(points, polygons, traits);
|
// simplify_polygons_in_polygon_soup(points, polygons, traits);
|
||||||
// split_pinched_polygons_in_polygon_soup(points, polygons, traits);
|
// split_pinched_polygons_in_polygon_soup(points, polygons, traits);
|
||||||
remove_invalid_polygons_in_polygon_soup(points, polygons);
|
remove_invalid_polygons_in_array_polygon_soup(points, polygons, traits);
|
||||||
merge_duplicate_polygons_in_polygon_soup(points, polygons, np);
|
merge_duplicate_polygons_in_polygon_soup(points, polygons, np);
|
||||||
remove_isolated_points_in_polygon_soup(points, polygons);
|
remove_isolated_points_in_polygon_soup(points, polygons);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue