mirror of https://github.com/CGAL/cgal
add specialization of repair_triangle_soup for indexes_range of array
This commit is contained in:
parent
4aa96bee99
commit
de0c054c27
|
|
@ -33,6 +33,7 @@ namespace Polygon_mesh_processing
|
||||||
namespace internal
|
namespace internal
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// Certified ceil function for exact number types
|
||||||
template <class NT> double double_ceil(Lazy_exact_nt< NT > x);
|
template <class NT> double double_ceil(Lazy_exact_nt< NT > x);
|
||||||
template <class NT> double double_ceil(NT x);
|
template <class NT> double double_ceil(NT x);
|
||||||
|
|
||||||
|
|
@ -42,7 +43,7 @@ double double_ceil(Lazy_exact_nt< NT > x){
|
||||||
double ceil_left=std::ceil(to_interval(x).first);
|
double ceil_left=std::ceil(to_interval(x).first);
|
||||||
if(ceil_left==std::ceil(to_interval(x).second))
|
if(ceil_left==std::ceil(to_interval(x).second))
|
||||||
return ceil_left;
|
return ceil_left;
|
||||||
// If not refine interval by contracting the DAG and try again
|
// If not refine the interval by contracting the DAG and try again
|
||||||
x.exact();
|
x.exact();
|
||||||
ceil_left=std::ceil(to_interval(x).first);
|
ceil_left=std::ceil(to_interval(x).first);
|
||||||
if(ceil_left==std::ceil(to_interval(x).second))
|
if(ceil_left==std::ceil(to_interval(x).second))
|
||||||
|
|
@ -69,6 +70,7 @@ double double_ceil(NT x){
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Color a range by an index, it is used by the visitor to track the correspondance between the input and the output
|
||||||
template <typename Range>
|
template <typename Range>
|
||||||
class Indexes_range : public Range{
|
class Indexes_range : public Range{
|
||||||
typedef std::remove_cv_t<typename std::iterator_traits<typename Range::iterator>::value_type> Value_type;
|
typedef std::remove_cv_t<typename std::iterator_traits<typename Range::iterator>::value_type> Value_type;
|
||||||
|
|
@ -98,18 +100,71 @@ private:
|
||||||
bool modified;
|
bool modified;
|
||||||
};
|
};
|
||||||
|
|
||||||
//repair_polygon_soup for triangles
|
// Repair_polygon_soup without remove_pinched_polygons since our polygon are triangles
|
||||||
template <typename PointRange, typename PolygonRange,
|
template <typename PointRange, typename PolygonRange,
|
||||||
typename Polygon = typename Polygon_types<PointRange, PolygonRange>::Polygon_3,
|
typename Polygon = typename Polygon_types<PointRange, PolygonRange>::Polygon_3>
|
||||||
typename NamedParameters>
|
struct Triangle_soup_fixer
|
||||||
|
{
|
||||||
|
template <typename NamedParameters>
|
||||||
|
void operator()(PointRange& points,
|
||||||
|
PolygonRange& polygons,
|
||||||
|
const NamedParameters& np) const
|
||||||
|
{
|
||||||
|
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());
|
||||||
|
|
||||||
|
merge_duplicate_points_in_polygon_soup(points, polygons, np);
|
||||||
|
simplify_polygons_in_polygon_soup(points, polygons, traits);
|
||||||
|
remove_invalid_polygons_in_polygon_soup(points, polygons);
|
||||||
|
merge_duplicate_polygons_in_polygon_soup(points, polygons, np);
|
||||||
|
remove_isolated_points_in_polygon_soup(points, polygons);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Specialization for array and Indexes_range of array
|
||||||
|
template <typename PointRange, typename PolygonRange, typename PID, std::size_t N>
|
||||||
|
struct Triangle_soup_fixer<PointRange, PolygonRange, std::array<PID, N> >
|
||||||
|
{
|
||||||
|
template <typename NamedParameters>
|
||||||
|
void operator()(PointRange& points,
|
||||||
|
PolygonRange& polygons,
|
||||||
|
const NamedParameters& np) const
|
||||||
|
{
|
||||||
|
repair_polygon_soup(points, polygons, np);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename PointRange, typename PolygonRange, typename PID, std::size_t N>
|
||||||
|
struct Triangle_soup_fixer<PointRange, PolygonRange, Indexes_range< std::array<PID, N> > >
|
||||||
|
{
|
||||||
|
template <typename NamedParameters>
|
||||||
|
void operator()(PointRange& points,
|
||||||
|
PolygonRange& polygons,
|
||||||
|
const NamedParameters& np) const
|
||||||
|
{
|
||||||
|
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());
|
||||||
|
|
||||||
|
merge_duplicate_points_in_polygon_soup(points, polygons, np);
|
||||||
|
remove_invalid_polygons_in_array_polygon_soup(points, polygons, traits);
|
||||||
|
merge_duplicate_polygons_in_polygon_soup(points, polygons, np);
|
||||||
|
remove_isolated_points_in_polygon_soup(points, polygons);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename PointRange, typename PolygonRange, typename NamedParameters>
|
||||||
void repair_triangle_soup(PointRange& points,
|
void repair_triangle_soup(PointRange& points,
|
||||||
PolygonRange& polygons,
|
PolygonRange& polygons,
|
||||||
const NamedParameters& np)
|
const NamedParameters& np)
|
||||||
{
|
{
|
||||||
merge_duplicate_points_in_polygon_soup(points, polygons, np);
|
Triangle_soup_fixer<PointRange, PolygonRange> fixer;
|
||||||
remove_invalid_polygons_in_polygon_soup(points, polygons);
|
fixer(points, polygons, np);
|
||||||
merge_duplicate_polygons_in_polygon_soup(points, polygons, np);
|
|
||||||
remove_isolated_points_in_polygon_soup(points, polygons);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Wrapp_id_visitor : public Autorefinement::Default_visitor
|
struct Wrapp_id_visitor : public Autorefinement::Default_visitor
|
||||||
|
|
@ -280,7 +335,6 @@ bool polygon_soup_snap_rounding_impl(PointRange &points,
|
||||||
#endif
|
#endif
|
||||||
for (Point_3 &p : points)
|
for (Point_3 &p : points)
|
||||||
p = Point_3(to_double(p.x()), to_double(p.y()), to_double(p.z()));
|
p = Point_3(to_double(p.x()), to_double(p.y()), to_double(p.z()));
|
||||||
|
|
||||||
repair_triangle_soup(points, triangles, np);
|
repair_triangle_soup(points, triangles, np);
|
||||||
|
|
||||||
// Get all intersecting triangles
|
// Get all intersecting triangles
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue