mirror of https://github.com/CGAL/cgal
281 lines
8.2 KiB
C++
281 lines
8.2 KiB
C++
namespace CGAL {
|
|
|
|
/*!
|
|
\ingroup PkgRidges_3Enums
|
|
The enum `Ridge_order` describes the order of differential quantities
|
|
used to distinguish elliptic and hyperbolic ridges. Third or fourth
|
|
order quantities may be used as explained in Section \ref Ridges_3Approximating
|
|
of the User Manual.
|
|
|
|
\sa `Ridge_approximation`
|
|
*/
|
|
enum Ridge_order { Ridge_order_3 = 3, Ridge_order_4};
|
|
|
|
/*!
|
|
\ingroup PkgRidges_3Enums
|
|
The enum `Ridge_type` describes the types for the class `Ridge_line`.
|
|
\sa `Ridge_line`
|
|
*/
|
|
enum Ridge_type {
|
|
MAX_ELLIPTIC_RIDGE = 1, MAX_HYPERBOLIC_RIDGE,
|
|
MAX_CREST_RIDGE, MIN_ELLIPTIC_RIDGE,
|
|
MIN_HYPERBOLIC_RIDGE, MIN_CREST_RIDGE
|
|
};
|
|
|
|
|
|
/*!
|
|
\ingroup PkgRidges_3
|
|
|
|
The function `compute_crest_ridges()` is a shortcut to the
|
|
method `Ridge_approximation::compute_crest_ridges()`.
|
|
See `Ridge_approximation::Ridge_approximation()` for an explanation of the parameters.
|
|
|
|
|
|
*/
|
|
template < class TriangleMesh,
|
|
class VertexFTMap,
|
|
class VertexVectorMap,
|
|
class OutputIterator>
|
|
OutputIterator compute_crest_ridges(const TriangleMesh &tm,
|
|
VertexFTMap vertex_k1_pm,
|
|
VertexFTMap vertex_k2_pm,
|
|
VertexFTMap vertex_b0_pm,
|
|
VertexFTMap vertex_b3_pm,
|
|
VertexVectorMap vertex_d1_pm,
|
|
VertexVectorMap vertex_d2_pm,
|
|
VertexFTMap vertex_P1_pm,
|
|
VertexFTMap vertex_P2_pm,
|
|
OutputIterator it,
|
|
CGAL::Ridge_order order = CGAL::Ridge_order_3);
|
|
|
|
} /* namespace CGAL */
|
|
|
|
namespace CGAL {
|
|
|
|
/*!
|
|
\ingroup PkgRidges_3
|
|
|
|
The function `compute_max_ridges()` is a shortcut to the
|
|
method `Ridge_approximation::compute_max_ridges()`.
|
|
See `Ridge_approximation::Ridge_approximation()` for an explanation of the parameters.
|
|
*/
|
|
template < class TriangleMesh,
|
|
class VertexFTMap,
|
|
class VertexVectorMap,
|
|
class OutputIterator>
|
|
OutputIterator compute_max_ridges(const TriangleMesh &tm,
|
|
VertexFTMap vertex_k1_pm,
|
|
VertexFTMap vertex_k2_pm,
|
|
VertexFTMap vertex_b0_pm,
|
|
VertexFTMap vertex_b3_pm,
|
|
VertexVectorMap vertex_d1_pm,
|
|
VertexVectorMap vertex_d2_pm,
|
|
VertexFTMap vertex_P1_pm, const
|
|
VertexFTMap vertex_P2_pm,
|
|
OutputIterator it,
|
|
CGAL::Ridge_order order = CGAL::Ridge_order_3);
|
|
|
|
} /* namespace CGAL */
|
|
|
|
namespace CGAL {
|
|
|
|
/*!
|
|
\ingroup PkgRidges_3
|
|
|
|
The function `compute_min_ridges()` is a shortcut to
|
|
the method `Ridge_approximation::compute_min_ridges()`.
|
|
See `Ridge_approximation::Ridge_approximation()` for an explanation of the parameters.
|
|
|
|
|
|
*/
|
|
template < class TriangleMesh,
|
|
class VertexFTMap,
|
|
class VertexVectorMap,
|
|
class OutputIterator>
|
|
OutputIterator compute_min_ridges(const TriangleMesh &tm,
|
|
VertexFTMap vertex_k1_pm,
|
|
VertexFTMap vertex_k2_pm,
|
|
VertexFTMap vertex_b0_pm,
|
|
VertexFTMap vertex_b3_pm,
|
|
VertexVectorMap vertex_d1_pm,
|
|
VertexVectorMap vertex_d2_pm,
|
|
VertexFTMap vertex_P1_pm,
|
|
VertexFTMap vertex_P2_pm,
|
|
OutputIterator it,
|
|
CGAL::Ridge_order order = CGAL::Ridge_order_3);
|
|
|
|
} /* namespace CGAL */
|
|
|
|
|
|
namespace CGAL {
|
|
|
|
/*!
|
|
\ingroup PkgRidges_3
|
|
|
|
The class `Ridge_approximation` computes the approximation of
|
|
ridges of a triangular polyhedral surface.
|
|
|
|
\tparam TriangleMesh is the surface type.
|
|
\tparam VertexFTMap A property map with `boost::graph_traits<TriangleMesh>::vertex_descriptor as key type and `FT` as value type.
|
|
\tparam VertexVectorMap A property map with `boost::graph_traits<TriangleMesh>::vertex_descriptor as key type and `Vector_3` as value type.
|
|
|
|
Requirements (checked at compile time):
|
|
- the types `TriangleMesh::Traits::FT` and
|
|
`boost::property_traits<VertexFTMap>::%value_type` must coincide;
|
|
- the types `TriangleMesh::Traits::Vector_3` and
|
|
`boost::property_traits<VertexVectorMap>::%value_type` must coincide;
|
|
- the types `boost::graph_traits<TriangleMesh>::%vertex_descriptor`,
|
|
`boost::property_traits<VertexFTMap>::%key_type` and
|
|
`boost::property_traits<VertexVectorMap>::%key_type` must coincide;
|
|
|
|
\sa `Ridge_line`
|
|
|
|
*/
|
|
template< typename TriangleMesh, typename VertexFTMap, typename VertexVectorMap >
|
|
class Ridge_approximation {
|
|
public:
|
|
|
|
|
|
/// \name Creation
|
|
/// @{
|
|
|
|
/*!
|
|
The two last property maps may
|
|
not be used if computations are performed with
|
|
the parameter `Ridges_order_3`, in which case these
|
|
property maps shall be initialized with their
|
|
default constructors.
|
|
|
|
\param tm the triangle mesh
|
|
\param vertex_k1_pm maximal principal curvatures
|
|
\param vertex_k2_pm minimal principal curvatures
|
|
\param vertex_b0_pm third order extremalities
|
|
\param vertex_b3_pm third order extremalities
|
|
\param vertex_d1_pm maximal principal directions of curvature
|
|
\param vertex_d2_pm minimal principal directions of curvature
|
|
\param vertex_P1_pm fourth order quantities
|
|
\param vertex_P2_pm fourth order quantities
|
|
*/
|
|
Ridge_approximation(const TriangleMesh &tm,
|
|
VertexFTMap vertex_k1_pm,
|
|
VertexFTMap vertex_k2_pm,
|
|
VertexFTMap vertex_b0_pm,
|
|
VertexFTMap vertex_b3_pm,
|
|
VertexVectorMap vertex_d1_pm,
|
|
VertexVectorMap vertex_d2_pm,
|
|
VertexFTMap vertex_P1_pm,
|
|
VertexFTMap vertex_P2_pm);
|
|
|
|
/*!
|
|
Outputs ridges of types `MAX_ELLIPTIC_RIDGE` and `MAX_HYPERBOLIC_RIDGE`.
|
|
\tparam OutputIterator an output iterator wìth value type `Ridge_line*`.
|
|
*/
|
|
template <class OutputIterator> OutputIterator compute_max_ridges(OutputIterator it, Rdge_order ord = Ridge_order_3);
|
|
|
|
/*!
|
|
Outputs ridges of types `MIN_ELLIPTIC_RIDGE` and `MIN_HYPERBOLIC_RIDGE`.
|
|
\tparam OutputIterator an output iterator with
|
|
value type `Ridge_line*`.
|
|
*/
|
|
template <class OutputIterator> OutputIterator compute_min_ridges(OutputIterator it, Rdge_order ord = Ridge_order_3);
|
|
|
|
/*!
|
|
Outputs ridges of types `MAX_CREST_RIDGE` and `MIN_CREST_RIDGE`.
|
|
\tparam OutputIterator is an output iterator with
|
|
value type `Ridge_line*`.
|
|
*/
|
|
template <class OutputIterator> OutputIterator compute_crest_ridges(OutputIterator it, Rdge_order ord = Ridge_order_3);
|
|
|
|
/// @}
|
|
|
|
}; /* end Ridge_approximation */
|
|
} /* end namespace CGAL */
|
|
|
|
namespace CGAL {
|
|
|
|
/*!
|
|
\ingroup PkgRidges_3
|
|
|
|
The class `Ridge_line` stores the description of a ridge line. The list
|
|
of halfedges defines a connected sequence of edges (but not as
|
|
oriented halfedges). The scalar \f$ b\f$ paired with a halfedge \f$ pq\f$ is the
|
|
barycentric coordinate of the crossing point \f$ r\f$ with the ridge:
|
|
\f$ r = b\times p + (1-b)\times q\f$.
|
|
|
|
\sa `Ridge_approximation`
|
|
|
|
*/
|
|
template< typename TriangleMesh >
|
|
class Ridge_line {
|
|
public:
|
|
|
|
/// \name Types
|
|
/// @{
|
|
|
|
/*!
|
|
|
|
*/
|
|
typedef typename TriangleMesh::Traits::FT FT;
|
|
|
|
/*!
|
|
|
|
*/
|
|
typedef typename boot::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor;
|
|
|
|
/*!
|
|
A halfedge crossed by a ridge is paired with the barycentric
|
|
coordinate of the crossing point.
|
|
*/
|
|
typedef std::pair< halfedge_descriptor, FT> Ridge_halfhedge;
|
|
|
|
/// @}
|
|
|
|
/// \name Creation
|
|
/// @{
|
|
|
|
/*!
|
|
default constructor.
|
|
*/
|
|
Ridge_line();
|
|
|
|
/// @}
|
|
|
|
/// \name Access Functions
|
|
/// @{
|
|
|
|
/*!
|
|
|
|
*/
|
|
Ridge_type line_type() const;
|
|
|
|
/*!
|
|
|
|
*/
|
|
FT strength() const;
|
|
|
|
/*!
|
|
|
|
*/
|
|
FT sharpness() const;
|
|
|
|
/*!
|
|
|
|
*/
|
|
const std::list<Ridge_halfhedge>* line() const;
|
|
|
|
|
|
/// @}
|
|
|
|
}; /* end Ridge_line */
|
|
|
|
/*!
|
|
\relates Ridge_line
|
|
Writes the line type, strength, sharpness and coordinates of the
|
|
points of the polyline to `os`.
|
|
*/
|
|
template< typename TriangleMesh >
|
|
std::ostream& operator<<(std::ostream& os, const Ridge_line<TriangleMesh>& r);
|
|
|
|
} /* end namespace CGAL */
|
|
|