mirror of https://github.com/CGAL/cgal
Document Point_set_with_structure class
This commit is contained in:
parent
a72d524525
commit
a098899693
|
|
@ -50,12 +50,27 @@
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\ingroup PkgPointSetProcessing
|
||||||
|
|
||||||
|
\brief A 3D point set with structure information based on a set of
|
||||||
|
detected planes.
|
||||||
|
|
||||||
|
Given a point set in 3D space along with a set of fitted planes, this
|
||||||
|
class stores a simplified and structured version of the point
|
||||||
|
set. Each output point is assigned to one, two or more primitives
|
||||||
|
(depending wether it belongs to a planar section, an edge or a if it
|
||||||
|
is a vertex). The implementation follow \cgalCite{cgal:la-srpss-13}.
|
||||||
|
|
||||||
|
\tparam Traits a model of `EfficientRANSACTraits`
|
||||||
|
|
||||||
|
*/
|
||||||
template <typename Traits>
|
template <typename Traits>
|
||||||
class Point_set_with_structure
|
class Point_set_with_structure
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
/// \cond SKIP_IN_MANUAL
|
||||||
typedef Point_set_with_structure<Traits> Self;
|
typedef Point_set_with_structure<Traits> Self;
|
||||||
|
|
||||||
typedef typename Traits::FT FT;
|
typedef typename Traits::FT FT;
|
||||||
|
|
@ -77,15 +92,21 @@ public:
|
||||||
typedef Shape_detection_3::Plane<Traits> Plane_shape;
|
typedef Shape_detection_3::Plane<Traits> Plane_shape;
|
||||||
|
|
||||||
enum Point_status { POINT, RESIDUS, PLANE, EDGE, CORNER, SKIPPED };
|
enum Point_status { POINT, RESIDUS, PLANE, EDGE, CORNER, SKIPPED };
|
||||||
|
|
||||||
|
/// \endcond
|
||||||
|
|
||||||
|
/// Tag classifying the coherence of a triplet of points with
|
||||||
|
/// respect to an inferred surface
|
||||||
enum Coherence_type
|
enum Coherence_type
|
||||||
{
|
{
|
||||||
INCOHERENT = -1, // Incoherent
|
INCOHERENT = -1, ///< Incoherent (facet violates the underlying structure)
|
||||||
FREEFORM = 0, // FF-coherent
|
FREEFORM = 0, ///< Free-form coherent (facet is between 3 free-form points)
|
||||||
VERTEX = 1, // S-coherent
|
VERTEX = 1, ///< Structure coherent, facet adjacent to a vertex
|
||||||
CREASE = 2, // S-coherent
|
CREASE = 2, ///< Structure coherent, facet adjacent to an edge
|
||||||
PLANAR = 3 // S-coherent
|
PLANAR = 3 ///< Structure coherent, facet inside a planar section
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// \cond SKIP_IN_MANUAL
|
||||||
private:
|
private:
|
||||||
|
|
||||||
class My_point_property_map{
|
class My_point_property_map{
|
||||||
|
|
@ -156,10 +177,18 @@ private:
|
||||||
std::vector<Corner> m_corners;
|
std::vector<Corner> m_corners;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
/// \endcond
|
||||||
|
|
||||||
Point_set_with_structure (Input_iterator begin, Input_iterator end,
|
/*!
|
||||||
const Shape_detection_3::Efficient_RANSAC<Traits>& shape_detection,
|
Construct a structured point set based on the input points and the
|
||||||
double epsilon, double attraction_factor = 3.)
|
associated shape detection object.
|
||||||
|
*/
|
||||||
|
Point_set_with_structure (Input_iterator begin, ///< iterator over the first input point.
|
||||||
|
Input_iterator end, ///< past-the-end iterator over the input points.
|
||||||
|
const Shape_detection_3::Efficient_RANSAC<Traits>&
|
||||||
|
shape_detection, ///< shape detection object
|
||||||
|
double epsilon, ///< size parameter
|
||||||
|
double attraction_factor = 3.) ///< attraction factory
|
||||||
: m_traits (shape_detection.traits())
|
: m_traits (shape_detection.traits())
|
||||||
{
|
{
|
||||||
for (Input_iterator it = begin; it != end; ++ it)
|
for (Input_iterator it = begin; it != end; ++ it)
|
||||||
|
|
@ -192,17 +221,30 @@ public:
|
||||||
clean ();
|
clean ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// \cond SKIP_IN_MANUAL
|
||||||
virtual ~Point_set_with_structure ()
|
virtual ~Point_set_with_structure ()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
/// \endcond
|
||||||
|
|
||||||
|
|
||||||
std::size_t size () const { return m_points.size (); }
|
std::size_t size () const { return m_points.size (); }
|
||||||
std::pair<Point, Vector> operator[] (std::size_t i) const
|
std::pair<Point, Vector> operator[] (std::size_t i) const
|
||||||
{ return std::make_pair (m_points[i], m_normals[i]); }
|
{ return std::make_pair (m_points[i], m_normals[i]); }
|
||||||
const Point& point (std::size_t i) const { return m_points[i]; }
|
const Point& point (std::size_t i) const { return m_points[i]; }
|
||||||
const Vector& normal (std::size_t i) const { return m_normals[i]; }
|
const Vector& normal (std::size_t i) const { return m_normals[i]; }
|
||||||
|
|
||||||
|
/*!
|
||||||
|
|
||||||
|
Returns all `Plane_shape` objects that are adjacent to the point
|
||||||
|
with index `i`.
|
||||||
|
|
||||||
|
\note Points not adjacent to any plane are free-form points,
|
||||||
|
points adjacent to 1 plane are planar points, points adjacent to 2
|
||||||
|
planes are edge points and points adjacent to 3 or more planes are
|
||||||
|
vertices.
|
||||||
|
|
||||||
|
*/
|
||||||
std::vector<boost::shared_ptr<Plane_shape> > adjacency (std::size_t i) const
|
std::vector<boost::shared_ptr<Plane_shape> > adjacency (std::size_t i) const
|
||||||
{
|
{
|
||||||
std::vector<boost::shared_ptr<Plane_shape> > out;
|
std::vector<boost::shared_ptr<Plane_shape> > out;
|
||||||
|
|
@ -222,6 +264,12 @@ public:
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
|
||||||
|
Computes the coherence of a facet between the 3 points indexed by
|
||||||
|
`f` with respect to the underlying structure.
|
||||||
|
|
||||||
|
*/
|
||||||
Coherence_type facet_coherence (CGAL::cpp11::array<std::size_t, 3>& f) const
|
Coherence_type facet_coherence (CGAL::cpp11::array<std::size_t, 3>& f) const
|
||||||
{
|
{
|
||||||
// O- FREEFORM CASE
|
// O- FREEFORM CASE
|
||||||
|
|
@ -375,6 +423,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// \cond SKIP_IN_MANUAL
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1312,7 +1361,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
/// \endcond
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1356,10 +1405,11 @@ structure_point_set (InputIterator first, ///< iterator over the first input po
|
||||||
InputIterator beyond, ///< past-the-end iterator over the input points.
|
InputIterator beyond, ///< past-the-end iterator over the input points.
|
||||||
OutputIterator output, ///< output iterator where output points are written
|
OutputIterator output, ///< output iterator where output points are written
|
||||||
Shape_detection_3::Efficient_RANSAC<Traits>&
|
Shape_detection_3::Efficient_RANSAC<Traits>&
|
||||||
shape_detection, ///< shape detection engine
|
shape_detection, ///< shape detection object
|
||||||
double epsilon) ///< size parameter
|
double epsilon, ///< size parameter
|
||||||
|
double attraction_factor = 3.) ///< attraction factory
|
||||||
{
|
{
|
||||||
Point_set_with_structure<Traits> pss (first, beyond, shape_detection, epsilon);
|
Point_set_with_structure<Traits> pss (first, beyond, shape_detection, epsilon, attraction_factor);
|
||||||
|
|
||||||
for (std::size_t i = 0; i < pss.size(); ++ i)
|
for (std::size_t i = 0; i < pss.size(); ++ i)
|
||||||
*(output ++) = pss[i];
|
*(output ++) = pss[i];
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue