Fix documentation of Surface_mesh_parameterization

Too many classes/functions/typedefs/etc. showing, extract_all to blame?
This commit is contained in:
Mael Rouxel-Labbé 2020-07-21 16:46:50 +02:00
parent aa2bdbdb5e
commit 93a70d32b9
17 changed files with 410 additions and 341 deletions

View File

@ -112,6 +112,10 @@ class Seam_mesh
typedef Seam_mesh<TM, SEM, SVM> Self; typedef Seam_mesh<TM, SEM, SVM> Self;
public: public:
/// The underlying mesh type
typedef TM Triangle_mesh;
// backward compatibility
typedef TM TriangleMesh; typedef TM TriangleMesh;
public: public:

View File

@ -2,8 +2,10 @@
PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - Planar Parameterization of Triangulated Surface Meshes" PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - Planar Parameterization of Triangulated Surface Meshes"
EXTRACT_ALL = false EXTRACT_ALL = false
HIDE_UNDOC_MEMBERS = true
HIDE_UNDOC_CLASSES = true HIDE_UNDOC_CLASSES = true
WARN_IF_UNDOCUMENTED = false WARN_IF_UNDOCUMENTED = false
HTML_EXTRA_FILES = ${CGAL_PACKAGE_DOC_DIR}/fig/nefertiti.jpg \ HTML_EXTRA_FILES = ${CGAL_PACKAGE_DOC_DIR}/fig/nefertiti.jpg \
${CGAL_PACKAGE_DOC_DIR}/fig/ARAP_new.jpg \ ${CGAL_PACKAGE_DOC_DIR}/fig/ARAP_new.jpg \
${CGAL_PACKAGE_DOC_DIR}/fig/orbifold_new.jpg \ ${CGAL_PACKAGE_DOC_DIR}/fig/orbifold_new.jpg \

View File

@ -49,9 +49,10 @@ This \cgal package implements several parameterization methods:
Conditionally guaranteed if all weights are positive and border is convex. Conditionally guaranteed if all weights are positive and border is convex.
- Floater Mean Value Coordinates \cgalCite{cgal:f-mvc-03} : - Floater Mean Value Coordinates \cgalCite{cgal:f-mvc-03} :
One-to-one mapping is guaranteed for convex border. One-to-one mapping is guaranteed for convex border.
- Iterative Authalic Parameterization \cgalCite{cgal:j-lrsspp-19}.
- Free border: - Free border:
- As Rigid As Possible Parameterization \cgalCite{liu2008local} - As Rigid As Possible Parameterization \cgalCite{liu2008local}
- Least Squares Conformal Maps \cgalCite{cgal:lprm-lscm-02}. - Least Squares Conformal Maps (LSCM) \cgalCite{cgal:lprm-lscm-02}.
- Borderless: - Borderless:
- Orbifold Tutte Embeddings \cgalCite{aigerman2015orbifold}. - Orbifold Tutte Embeddings \cgalCite{aigerman2015orbifold}.
@ -60,6 +61,7 @@ The following classes implement the methods listed above:
- `CGAL::Surface_mesh_parameterization::Barycentric_mapping_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>` - `CGAL::Surface_mesh_parameterization::Barycentric_mapping_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>`
- `CGAL::Surface_mesh_parameterization::Discrete_authalic_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>` - `CGAL::Surface_mesh_parameterization::Discrete_authalic_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>`
- `CGAL::Surface_mesh_parameterization::Discrete_conformal_map_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>` - `CGAL::Surface_mesh_parameterization::Discrete_conformal_map_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>`
- `CGAL::Surface_mesh_parameterization::Iterative_authalic_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>`
- `CGAL::Surface_mesh_parameterization::LSCM_parameterizer_3<TriangleMesh, BorderParameterizer>` - `CGAL::Surface_mesh_parameterization::LSCM_parameterizer_3<TriangleMesh, BorderParameterizer>`
- `CGAL::Surface_mesh_parameterization::Mean_value_coordinates_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>` - `CGAL::Surface_mesh_parameterization::Mean_value_coordinates_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>`
- `CGAL::Surface_mesh_parameterization::Orbifold_Tutte_parameterizer_3<TriangleMesh, SolverTraits>` - `CGAL::Surface_mesh_parameterization::Orbifold_Tutte_parameterizer_3<TriangleMesh, SolverTraits>`

View File

@ -218,7 +218,7 @@ convex combination condition. This algorithm amounts to solve one
sparse linear system for each set of parameter coordinates, with a sparse linear system for each set of parameter coordinates, with a
\#vertices x \#vertices sparse and symmetric positive definite matrix \#vertices x \#vertices sparse and symmetric positive definite matrix
(if the border vertices are eliminated from the linear system). (if the border vertices are eliminated from the linear system).
A coefficient \f$ (i, j)\f$ of the matrix is set to 1 for an edge linking A coefficient \f$ (i,j)\f$ of the matrix is set to 1 for an edge linking
the vertex \f$ v_i\f$ to the vertex \f$ v_j\f$, to minus the degree of the the vertex \f$ v_i\f$ to the vertex \f$ v_j\f$, to minus the degree of the
vertex \f$ v_i\f$ for a diagonal element, and to 0 for any other matrix vertex \f$ v_i\f$ for a diagonal element, and to 0 for any other matrix
entry. Although a bijective mapping is guaranteed when the border is convex, entry. Although a bijective mapping is guaranteed when the border is convex,
@ -475,55 +475,43 @@ underlying (input) mesh.
\subsection Surface_mesh_parameterizationParameterization Parameterization Methods and Guarantees \subsection Surface_mesh_parameterizationParameterization Parameterization Methods and Guarantees
<UL> <ul>
<li><b>Fixed boundaries</b>
<LI>Fixed boundaries <ul>
<li><em>One-to-one mapping</em><br>
<UL> Tutte's theorem guarantees a one-to-one mapping provided that the weights are all positive
and the border is convex.
<LI>One-to-one mapping It is the case for Tutte Barycentric Mapping and Floater Mean Value Coordinates.
It is not always the case for Discrete Conformal Map (cotangents), Discrete Authalic,
Tutte's theorem guarantees a one-to-one mapping provided that the weights are all positive and Iterative Authalic parameterizations.
and the border is convex. </li>
It is the case for Tutte Barycentric Mapping and Floater Mean Value Coordinates. <li><em>Non-singularity of the matrix</em><br>
It is not always the case for Discrete Conformal Map (cotangents) and Geshorgin's theorem guarantees the convergence of the solver if the matrix is diagonal dominant.
Discrete Authalic parameterization. This is the case with positive weights (Tutte Barycentric Mapping and Floater Mean Value Coordinates).
</li>
<LI>Non-singularity of the matrix </ul>
</li>
Geshorgin's theorem guarantees the convergence of the solver if the matrix is diagonal dominant. <li><b>Free boundaries</b>
This is the case with positive weights (Tutte Barycentric Mapping and Floater Mean Value Coordinates). <ul>
<li><em>One-to-one mapping</em><br>
</UL> No guarantee is provided by either LSCM or ARAP parameterizations (both global overlaps
and triangle flips can occur).
<LI>Free boundaries </li>
<li><em>Non-singularity of the matrix</em><br>
<UL> For LSCM, the matrix of the system is the Gram matrix of a matrix with maximal rank,
and is therefore non-singular (Gram theorem).
<LI>One-to-one mapping </li>
</ul>
No guarantee is provided by either LSCM or ARAP parameterizations (both global </li>
overlaps and triangle flips can occur). <li><b>Boundary-less</b>
<ul>
<LI>Non-singularity of the matrix <li><em>One-to-one mapping</em><br>
The Orbifold-Tutte embedding is guaranteed to exist and to be computable
For LSCM, the matrix of the system is the Gram matrix of a matrix with maximal rank, via a sparse linear system.
and is therefore non-singular (Gram theorem). </li>
</ul>
</UL> </li>
</ul>
<LI> Boundary-less
<UL>
<LI>One-to-one mapping
The Orbifold-Tutte embedding is guaranteed to exist and to be computable
via a sparse linear system.
</UL>
</UL>
\section Surface_mesh_parameterizationExtendingthe Implementation History \section Surface_mesh_parameterizationExtendingthe Implementation History

View File

@ -129,7 +129,7 @@ namespace Surface_mesh_parameterization {
/// a random vertex is pinned. /// a random vertex is pinned.
/// ///
/// If flips are present in the initial parameterization, a post-processing step /// If flips are present in the initial parameterization, a post-processing step
/// is applied using `CGAL::Surface_mesh_parameterization::MVC_post_processor_3<TriangleMesh, SolverTraits_>` /// is applied using `CGAL::Surface_mesh_parameterization::MVC_post_processor_3<TriangleMesh_, SolverTraits_>`
/// to attempt to obtain a valid final embedding. /// to attempt to obtain a valid final embedding.
/// ///
/// A one-to-one mapping is *not* guaranteed. /// A one-to-one mapping is *not* guaranteed.
@ -162,6 +162,7 @@ namespace Surface_mesh_parameterization {
/// \endcode /// \endcode
/// ///
/// \sa `CGAL::Surface_mesh_parameterization::Fixed_border_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>` /// \sa `CGAL::Surface_mesh_parameterization::Fixed_border_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>`
/// \sa `CGAL::Iterative_authalic_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>`
/// ///
template < class TriangleMesh_, template < class TriangleMesh_,
class BorderParameterizer_ = Default, class BorderParameterizer_ = Default,
@ -194,28 +195,39 @@ public:
#endif #endif
>::type Solver_traits; >::type Solver_traits;
#else #else
/// Border parameterizer type
typedef Border_parameterizer_ Border_parameterizer; typedef Border_parameterizer_ Border_parameterizer;
/// Solver traits type
typedef SolverTraits_ Solver_traits; typedef SolverTraits_ Solver_traits;
/// Number type, deduced from the internal vertex point map of `Triangle_mesh`
typedef unspecified_type NT;
#endif #endif
/// Triangle mesh type
typedef TriangleMesh_ Triangle_mesh;
typedef TriangleMesh_ TriangleMesh; typedef TriangleMesh_ TriangleMesh;
/// Mesh halfedge type
typedef typename boost::graph_traits<Triangle_mesh>::halfedge_descriptor halfedge_descriptor;
// Private types // Private types
private: private:
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::vertex_descriptor vertex_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::face_descriptor face_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::face_descriptor face_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::face_iterator face_iterator;
typedef typename boost::graph_traits<TriangleMesh>::face_iterator face_iterator; typedef typename boost::graph_traits<Triangle_mesh>::vertex_iterator vertex_iterator;
typedef typename boost::graph_traits<TriangleMesh>::vertex_iterator vertex_iterator;
typedef CGAL::Halfedge_around_target_circulator<TriangleMesh> halfedge_around_target_circulator; typedef CGAL::Halfedge_around_target_circulator<Triangle_mesh> halfedge_around_target_circulator;
typedef CGAL::Halfedge_around_face_circulator<TriangleMesh> halfedge_around_face_circulator; typedef CGAL::Halfedge_around_face_circulator<Triangle_mesh> halfedge_around_face_circulator;
typedef boost::unordered_set<vertex_descriptor> Vertex_set; typedef boost::unordered_set<vertex_descriptor> Vertex_set;
typedef std::vector<face_descriptor> Faces_vector; typedef std::vector<face_descriptor> Faces_vector;
// Traits subtypes: // Traits subtypes:
typedef typename internal::Kernel_traits<TriangleMesh>::Kernel Kernel; typedef typename internal::Kernel_traits<Triangle_mesh>::Kernel Kernel;
typedef typename Kernel::FT NT; typedef typename Kernel::FT NT;
typedef typename Kernel::Point_2 Point_2; typedef typename Kernel::Point_2 Point_2;
typedef typename Kernel::Point_3 Point_3; typedef typename Kernel::Point_3 Point_3;
@ -277,7 +289,7 @@ private:
template <typename VertexUVMap, template <typename VertexUVMap,
typename VertexIndexMap> typename VertexIndexMap>
void output_uvmap(const std::string filename, void output_uvmap(const std::string filename,
const TriangleMesh& mesh, const Triangle_mesh& mesh,
const Vertex_set& vertices, const Vertex_set& vertices,
const Faces_vector& faces, const Faces_vector& faces,
const VertexUVMap uvmap, const VertexUVMap uvmap,
@ -292,7 +304,7 @@ private:
typename VertexIndexMap> typename VertexIndexMap>
void output_uvmap(const std::string filename, void output_uvmap(const std::string filename,
const unsigned int iter, const unsigned int iter,
const TriangleMesh& mesh, const Triangle_mesh& mesh,
const Vertex_set& vertices, const Vertex_set& vertices,
const Faces_vector& faces, const Faces_vector& faces,
const VertexUVMap uvmap, const VertexUVMap uvmap,
@ -331,12 +343,12 @@ private:
// Private operations // Private operations
private: private:
// Store the vertices and faces of the mesh in memory. // Store the vertices and faces of the mesh in memory.
Error_code initialize_containers(const TriangleMesh& mesh, Error_code initialize_containers(const Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
Vertex_set& vertices, Vertex_set& vertices,
Faces_vector& faces) const Faces_vector& faces) const
{ {
internal::Containers_filler<TriangleMesh> fc(mesh, vertices, &faces); internal::Containers_filler<Triangle_mesh> fc(mesh, vertices, &faces);
Polygon_mesh_processing::connected_component( Polygon_mesh_processing::connected_component(
face(opposite(bhd, mesh), mesh), face(opposite(bhd, mesh), mesh),
mesh, mesh,
@ -351,7 +363,7 @@ private:
// Initialize the UV values with a first parameterization of the input. // Initialize the UV values with a first parameterization of the input.
template <typename VertexUVMap, template <typename VertexUVMap,
typename VertexIndexMap> typename VertexIndexMap>
Error_code compute_initial_uv_map(TriangleMesh& mesh, Error_code compute_initial_uv_map(Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexUVMap uvmap, VertexUVMap uvmap,
VertexIndexMap vimap) const VertexIndexMap vimap) const
@ -372,11 +384,11 @@ private:
// According to the paper, MVC is better for single border and LSCM is better // According to the paper, MVC is better for single border and LSCM is better
// when there are multiple borders // when there are multiple borders
if(number_of_borders == 1) { if(number_of_borders == 1) {
typedef Mean_value_coordinates_parameterizer_3<TriangleMesh> MVC_parameterizer; typedef Mean_value_coordinates_parameterizer_3<Triangle_mesh> MVC_parameterizer;
MVC_parameterizer mvc_parameterizer; MVC_parameterizer mvc_parameterizer;
status = mvc_parameterizer.parameterize(mesh, bhd, uvmap, vimap, vpmap); status = mvc_parameterizer.parameterize(mesh, bhd, uvmap, vimap, vpmap);
} else { } else {
typedef LSCM_parameterizer_3<TriangleMesh, Border_parameterizer> LSCM_parameterizer; typedef LSCM_parameterizer_3<Triangle_mesh, Border_parameterizer> LSCM_parameterizer;
LSCM_parameterizer lscm_parameterizer; LSCM_parameterizer lscm_parameterizer;
status = lscm_parameterizer.parameterize(mesh, bhd, uvmap, vimap, vpmap); status = lscm_parameterizer.parameterize(mesh, bhd, uvmap, vimap, vpmap);
} }
@ -389,7 +401,7 @@ private:
template <typename VertexUVMap, template <typename VertexUVMap,
typename VertexIndexMap, typename VertexIndexMap,
typename VertexParameterizedMap> typename VertexParameterizedMap>
Error_code parameterize_border(const TriangleMesh& mesh, Error_code parameterize_border(const Triangle_mesh& mesh,
const Vertex_set& vertices, const Vertex_set& vertices,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexIndexMap vimap, VertexIndexMap vimap,
@ -422,14 +434,14 @@ private:
} }
// Compute the cotangent of the angle between the vectors ij and ik. // Compute the cotangent of the angle between the vectors ij and ik.
void compute_cotangent_angle(const TriangleMesh& mesh, void compute_cotangent_angle(const Triangle_mesh& mesh,
halfedge_descriptor hd, halfedge_descriptor hd,
vertex_descriptor vi, vertex_descriptor vi,
vertex_descriptor vj, vertex_descriptor vj,
vertex_descriptor vk, vertex_descriptor vk,
Cot_map ctmap) const Cot_map ctmap) const
{ {
typedef typename boost::property_map<TriangleMesh, typedef typename boost::property_map<Triangle_mesh,
boost::vertex_point_t>::const_type PPmap; boost::vertex_point_t>::const_type PPmap;
const PPmap ppmap = get(vertex_point, mesh); const PPmap ppmap = get(vertex_point, mesh);
@ -442,7 +454,7 @@ private:
} }
// Fill the map 'ctmap' with the cotangents of the angles of the faces of 'mesh'. // Fill the map 'ctmap' with the cotangents of the angles of the faces of 'mesh'.
Error_code compute_cotangent_angles(const TriangleMesh& mesh, Error_code compute_cotangent_angles(const Triangle_mesh& mesh,
const Faces_vector& faces, const Faces_vector& faces,
Cot_map ctmap) const Cot_map ctmap) const
{ {
@ -468,8 +480,8 @@ private:
return OK; return OK;
} }
// computes `w_ij`, the `(i, j)`-coefficient of matrix `A` for `j` neighbor vertex of `i`. // computes `w_ij`, the `(i,j)`-coefficient of matrix `A` for `j` neighbor vertex of `i`.
NT compute_w_ij(const TriangleMesh& mesh, NT compute_w_ij(const Triangle_mesh& mesh,
halfedge_descriptor hd, halfedge_descriptor hd,
const Cot_map ctmap) const const Cot_map ctmap) const
{ {
@ -496,7 +508,7 @@ private:
// \pre Line i of A must contain only zeros. // \pre Line i of A must contain only zeros.
template <typename VertexIndexMap> template <typename VertexIndexMap>
Error_code fill_linear_system_matrix(Matrix& A, Error_code fill_linear_system_matrix(Matrix& A,
const TriangleMesh& mesh, const Triangle_mesh& mesh,
vertex_descriptor vertex, vertex_descriptor vertex,
const Cot_map ct_map, const Cot_map ct_map,
VertexIndexMap vimap) const VertexIndexMap vimap) const
@ -538,7 +550,7 @@ private:
// after (at least two) border vertices parameterization. // after (at least two) border vertices parameterization.
template <typename VertexIndexMap, template <typename VertexIndexMap,
typename VertexParameterizedMap> typename VertexParameterizedMap>
Error_code initialize_matrix_A(const TriangleMesh& mesh, Error_code initialize_matrix_A(const Triangle_mesh& mesh,
const Vertex_set& vertices, const Vertex_set& vertices,
const Cot_map ctmap, const Cot_map ctmap,
VertexIndexMap vimap, VertexIndexMap vimap,
@ -695,7 +707,7 @@ private:
// Compute the root that gives the lowest face energy. // Compute the root that gives the lowest face energy.
template <typename VertexUVMap> template <typename VertexUVMap>
std::size_t compute_root_with_lowest_energy(const TriangleMesh& mesh, std::size_t compute_root_with_lowest_energy(const Triangle_mesh& mesh,
face_descriptor fd, face_descriptor fd,
const Cot_map ctmap, const Cot_map ctmap,
const Local_points& lp, const Local_points& lp,
@ -722,7 +734,7 @@ private:
// Compute the root that gives the lowest face energy. // Compute the root that gives the lowest face energy.
template <typename VertexUVMap> template <typename VertexUVMap>
std::size_t compute_root_with_lowest_energy(const TriangleMesh& mesh, std::size_t compute_root_with_lowest_energy(const Triangle_mesh& mesh,
face_descriptor fd, face_descriptor fd,
const Cot_map ctmap, const Cot_map ctmap,
const Local_points& lp, const Local_points& lp,
@ -748,7 +760,7 @@ private:
// Compute the optimal values of the linear transformation matrices Lt. // Compute the optimal values of the linear transformation matrices Lt.
template <typename VertexUVMap> template <typename VertexUVMap>
Error_code compute_optimal_Lt_matrices(const TriangleMesh& mesh, Error_code compute_optimal_Lt_matrices(const Triangle_mesh& mesh,
const Faces_vector& faces, const Faces_vector& faces,
const Cot_map ctmap, const Cot_map ctmap,
const Local_points& lp, const Local_points& lp,
@ -874,13 +886,13 @@ private:
} }
// Compute the local parameterization (2D) of a face and store it in memory. // Compute the local parameterization (2D) of a face and store it in memory.
void project_face(const TriangleMesh& mesh, void project_face(const Triangle_mesh& mesh,
vertex_descriptor vi, vertex_descriptor vi,
vertex_descriptor vj, vertex_descriptor vj,
vertex_descriptor vk, vertex_descriptor vk,
Local_points& lp) const Local_points& lp) const
{ {
typedef typename boost::property_map<TriangleMesh, typedef typename boost::property_map<Triangle_mesh,
boost::vertex_point_t>::const_type PPmap; boost::vertex_point_t>::const_type PPmap;
const PPmap ppmap = get(vertex_point, mesh); const PPmap ppmap = get(vertex_point, mesh);
@ -900,7 +912,7 @@ private:
// Utility for fill_linear_system_rhs(): // Utility for fill_linear_system_rhs():
// Compute the local isometric parameterization (2D) of the faces of the mesh. // Compute the local isometric parameterization (2D) of the faces of the mesh.
Error_code compute_local_parameterization(const TriangleMesh& mesh, Error_code compute_local_parameterization(const Triangle_mesh& mesh,
const Faces_vector& faces, const Faces_vector& faces,
Local_points& lp, Local_points& lp,
Lp_map lpmap) const Lp_map lpmap) const
@ -936,9 +948,9 @@ private:
return OK; return OK;
} }
// Compute the coefficient b_ij = (i, j) of the right hand side vector B, // Compute the coefficient b_ij = (i,j) of the right hand side vector B,
// for j neighbor vertex of i. // for j neighbor vertex of i.
void compute_b_ij(const TriangleMesh& mesh, void compute_b_ij(const Triangle_mesh& mesh,
halfedge_descriptor hd, halfedge_descriptor hd,
const Cot_map ctmap, const Cot_map ctmap,
const Local_points& lp, const Local_points& lp,
@ -1009,7 +1021,7 @@ private:
// \pre Vertex i musn't be already parameterized. // \pre Vertex i musn't be already parameterized.
// \pre Lines i of Bu and Bv must be zero. // \pre Lines i of Bu and Bv must be zero.
template <typename VertexIndexMap> template <typename VertexIndexMap>
Error_code fill_linear_system_rhs(const TriangleMesh& mesh, Error_code fill_linear_system_rhs(const Triangle_mesh& mesh,
vertex_descriptor vertex, vertex_descriptor vertex,
const Cot_map ctmap, const Cot_map ctmap,
const Local_points& lp, const Local_points& lp,
@ -1053,7 +1065,7 @@ private:
template <typename VertexUVMap, template <typename VertexUVMap,
typename VertexIndexMap, typename VertexIndexMap,
typename VertexParameterizedMap> typename VertexParameterizedMap>
Error_code compute_rhs(const TriangleMesh& mesh, Error_code compute_rhs(const Triangle_mesh& mesh,
const Vertex_set& vertices, const Vertex_set& vertices,
const Cot_map ctmap, const Cot_map ctmap,
const Local_points& lp, const Local_points& lp,
@ -1091,7 +1103,7 @@ private:
template <typename VertexUVMap, template <typename VertexUVMap,
typename VertexIndexMap, typename VertexIndexMap,
typename VertexParameterizedMap> typename VertexParameterizedMap>
Error_code update_solution(const TriangleMesh& mesh, Error_code update_solution(const Triangle_mesh& mesh,
const Vertex_set& vertices, const Vertex_set& vertices,
const Cot_map ctmap, const Cot_map ctmap,
const Local_points& lp, const Local_points& lp,
@ -1147,7 +1159,7 @@ private:
// Compute the current energy of a face, given a linear transformation matrix. // Compute the current energy of a face, given a linear transformation matrix.
template <typename VertexUVMap> template <typename VertexUVMap>
NT compute_current_face_energy(const TriangleMesh& mesh, NT compute_current_face_energy(const Triangle_mesh& mesh,
face_descriptor fd, face_descriptor fd,
const Cot_map ctmap, const Cot_map ctmap,
const Local_points& lp, const Local_points& lp,
@ -1190,7 +1202,7 @@ private:
// Compute the current energy of a face. // Compute the current energy of a face.
template <typename VertexUVMap> template <typename VertexUVMap>
NT compute_current_face_energy(const TriangleMesh& mesh, NT compute_current_face_energy(const Triangle_mesh& mesh,
face_descriptor fd, face_descriptor fd,
const Cot_map ctmap, const Cot_map ctmap,
const Local_points& lp, const Local_points& lp,
@ -1207,7 +1219,7 @@ private:
// Compute the current energy of the parameterization. // Compute the current energy of the parameterization.
template <typename VertexUVMap> template <typename VertexUVMap>
NT compute_current_energy(const TriangleMesh& mesh, NT compute_current_energy(const Triangle_mesh& mesh,
const Faces_vector& faces, const Faces_vector& faces,
const Cot_map ctmap, const Cot_map ctmap,
const Local_points& lp, const Local_points& lp,
@ -1232,14 +1244,14 @@ private:
// the (hopefully few) flips in the result. // the (hopefully few) flips in the result.
template <typename VertexUVMap, template <typename VertexUVMap,
typename VertexIndexMap> typename VertexIndexMap>
Error_code post_process(const TriangleMesh& mesh, Error_code post_process(const Triangle_mesh& mesh,
const Vertex_set& vertices, const Vertex_set& vertices,
const Faces_vector& faces, const Faces_vector& faces,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexUVMap uvmap, VertexUVMap uvmap,
const VertexIndexMap vimap) const const VertexIndexMap vimap) const
{ {
typedef MVC_post_processor_3<TriangleMesh> Post_processor; typedef MVC_post_processor_3<Triangle_mesh> Post_processor;
Post_processor p; Post_processor p;
Error_code status = p.parameterize(mesh, vertices, faces, bhd, uvmap, vimap); Error_code status = p.parameterize(mesh, vertices, faces, bhd, uvmap, vimap);
@ -1256,9 +1268,9 @@ private:
// Public operations // Public operations
public: public:
/// returns whether the 3D -> 2D mapping is one-to-one. /// returns whether the 3D -> 2D mapping is one-to-one.
template <typename VertexUVMap> template <typename FaceRange, typename VertexUVMap>
bool is_one_to_one_mapping(const TriangleMesh& mesh, bool is_one_to_one_mapping(const Triangle_mesh& mesh,
const Faces_vector& faces, const FaceRange& faces,
const VertexUVMap uvmap) const const VertexUVMap uvmap) const
{ {
return internal::is_one_to_one_mapping(mesh, faces, uvmap); return internal::is_one_to_one_mapping(mesh, faces, uvmap);
@ -1269,14 +1281,14 @@ public:
/// The result is the (u,v) pair image of each vertex of the 3D surface. /// The result is the (u,v) pair image of each vertex of the 3D surface.
/// ///
/// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with /// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// %Point_2 (type deduced from `TriangleMesh` using `Kernel_traits`) /// %Point_2 (type deduced from `Triangle_mesh` using `Kernel_traits`)
/// as value type. /// as value type.
/// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with /// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// a unique integer as value type. /// a unique integer as value type.
/// \tparam VertexParameterizedMap must be a model of `ReadWritePropertyMap` with /// \tparam VertexParameterizedMap must be a model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// a Boolean as value type. /// a Boolean as value type.
/// ///
/// \param mesh a triangulated surface. /// \param mesh a triangulated surface.
@ -1291,14 +1303,14 @@ public:
template <typename VertexUVMap, template <typename VertexUVMap,
typename VertexIndexMap, typename VertexIndexMap,
typename VertexParameterizedMap> typename VertexParameterizedMap>
Error_code parameterize(TriangleMesh& mesh, Error_code parameterize(Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexUVMap uvmap, VertexUVMap uvmap,
VertexIndexMap vimap, VertexIndexMap vimap,
VertexParameterizedMap vpmap) VertexParameterizedMap vpmap)
{ {
CGAL_precondition(is_valid_polygon_mesh(mesh)); CGAL_precondition(is_valid_polygon_mesh(mesh));
CGAL_precondition(bhd != boost::graph_traits<TriangleMesh>::null_halfedge() && is_border(bhd, mesh)); CGAL_precondition(bhd != boost::graph_traits<Triangle_mesh>::null_halfedge() && is_border(bhd, mesh));
Error_code status = OK; Error_code status = OK;

View File

@ -21,6 +21,7 @@
#include <CGAL/Surface_mesh_parameterization/Fixed_border_parameterizer_3.h> #include <CGAL/Surface_mesh_parameterization/Fixed_border_parameterizer_3.h>
#include <CGAL/Default.h> #include <CGAL/Default.h>
#include <CGAL/iterator.h>
#if defined(CGAL_EIGEN3_ENABLED) #if defined(CGAL_EIGEN3_ENABLED)
#include <CGAL/Eigen_solver_traits.h> #include <CGAL/Eigen_solver_traits.h>
@ -108,24 +109,32 @@ public:
#endif #endif
>::type Solver_traits; >::type Solver_traits;
#else #else
/// Border parameterizer type
typedef Border_parameterizer_ Border_parameterizer; typedef Border_parameterizer_ Border_parameterizer;
typedef SolverTraits_ SolverTraits;
/// Solver traits type
typedef SolverTraits_ Solver_traits;
#endif #endif
/// Triangle mesh type
typedef TriangleMesh_ Triangle_mesh;
typedef TriangleMesh_ TriangleMesh; typedef TriangleMesh_ TriangleMesh;
/// Mesh vertex type
typedef typename boost::graph_traits<Triangle_mesh>::vertex_descriptor vertex_descriptor;
/// Mesh halfedge type
typedef typename boost::graph_traits<Triangle_mesh>::halfedge_descriptor halfedge_descriptor;
private: private:
// Superclass // Superclass
typedef Fixed_border_parameterizer_3<TriangleMesh_, typedef Fixed_border_parameterizer_3<Triangle_mesh,
Border_parameterizer, Border_parameterizer,
Solver_traits> Base; Solver_traits> Base;
// Private types // Private types
private: private:
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor;
typedef CGAL::Vertex_around_target_circulator<TriangleMesh> vertex_around_target_circulator;
typedef typename Base::NT NT; typedef typename Base::NT NT;
// Solver traits subtypes: // Solver traits subtypes:
@ -139,7 +148,7 @@ public:
///< %Object that maps the surface's border to 2D space. ///< %Object that maps the surface's border to 2D space.
Solver_traits sparse_la = Solver_traits()) Solver_traits sparse_la = Solver_traits())
///< Traits object to access a sparse linear system. ///< Traits object to access a sparse linear system.
: Fixed_border_parameterizer_3<TriangleMesh, : Fixed_border_parameterizer_3<Triangle_mesh,
Border_parameterizer, Border_parameterizer,
Solver_traits>(border_param, sparse_la) Solver_traits>(border_param, sparse_la)
{ } { }
@ -149,7 +158,7 @@ public:
/// returns whether the 3D -> 2D mapping is one-to-one. /// returns whether the 3D -> 2D mapping is one-to-one.
template <typename VertexUVMap, template <typename VertexUVMap,
typename Faces_Container> typename Faces_Container>
bool is_one_to_one_mapping(const TriangleMesh& mesh, bool is_one_to_one_mapping(const Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
const VertexUVMap uvmap) const const VertexUVMap uvmap) const
{ {
@ -166,9 +175,9 @@ public:
// Protected operations // Protected operations
protected: protected:
/// computes `w_ij`, the coefficient of matrix `A` for `j` neighbor vertex of `i`. /// computes `w_ij`, the coefficient of matrix `A` for `j` neighbor vertex of `i`.
virtual NT compute_w_ij(const TriangleMesh& /* mesh */, virtual NT compute_w_ij(const Triangle_mesh& /* mesh */,
vertex_descriptor /* main_vertex_v_i */, vertex_descriptor /* main_vertex_v_i */,
vertex_around_target_circulator /* neighbor_vertex_v_j */ ) const Vertex_around_target_circulator<Triangle_mesh> /* neighbor_vertex_v_j */ ) const
{ {
/// In the Tutte Barycentric Mapping algorithm, we have `w_ij = 1`, for `j` neighbor vertex of `i`. /// In the Tutte Barycentric Mapping algorithm, we have `w_ij = 1`, for `j` neighbor vertex of `i`.
return 1.; return 1.;

View File

@ -62,29 +62,33 @@ class Circular_border_parameterizer_3
{ {
// Public types // Public types
public: public:
typedef TriangleMesh_ TriangleMesh; /// Triangle mesh type
typedef TriangleMesh_ Triangle_mesh;
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor; /// Mesh vertex type
typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::vertex_descriptor vertex_descriptor;
/// Mesh halfedge type
typedef typename boost::graph_traits<Triangle_mesh>::halfedge_descriptor halfedge_descriptor;
// Protected types // Protected types
protected: protected:
typedef typename internal::Kernel_traits<TriangleMesh_>::PPM PPM; typedef typename internal::Kernel_traits<Triangle_mesh>::PPM PPM;
typedef typename internal::Kernel_traits<TriangleMesh_>::Kernel Kernel; typedef typename internal::Kernel_traits<Triangle_mesh>::Kernel Kernel;
typedef typename Kernel::FT NT; typedef typename Kernel::FT NT;
typedef typename Kernel::Point_2 Point_2; typedef typename Kernel::Point_2 Point_2;
typedef typename Kernel::Vector_3 Vector_3; typedef typename Kernel::Vector_3 Vector_3;
// Protected operations // Protected operations
protected: protected:
virtual NT compute_edge_length(const TriangleMesh& mesh, virtual NT compute_edge_length(const Triangle_mesh& mesh,
vertex_descriptor source, vertex_descriptor source,
vertex_descriptor target) const = 0; vertex_descriptor target) const = 0;
// Private operations // Private operations
private: private:
// Compute the total length of the border // Compute the total length of the border
NT compute_border_length(const TriangleMesh& mesh, NT compute_border_length(const Triangle_mesh& mesh,
halfedge_descriptor bhd) const halfedge_descriptor bhd) const
{ {
NT len = 0.0; NT len = 0.0;
@ -103,14 +107,14 @@ public:
/// `compute_edge_length()`. /// `compute_edge_length()`.
/// ///
/// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with /// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// %Point_2 (type deduced from `TriangleMesh` using `Kernel_traits`) /// %Point_2 (type deduced from `Triangle_mesh` using `Kernel_traits`)
/// as value type. /// as value type.
/// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with /// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// a unique integer as value type. /// a unique integer as value type.
/// \tparam VertexParameterizedMap must be a model of `ReadWritePropertyMap` with /// \tparam VertexParameterizedMap must be a model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// a Boolean as value type. /// a Boolean as value type.
/// ///
/// \param mesh a triangulated surface. /// \param mesh a triangulated surface.
@ -124,7 +128,7 @@ public:
template <typename VertexUVmap, template <typename VertexUVmap,
typename VertexIndexMap, typename VertexIndexMap,
typename VertexParameterizedMap> typename VertexParameterizedMap>
Error_code parameterize(const TriangleMesh& mesh, Error_code parameterize(const Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexUVmap uvmap, VertexUVmap uvmap,
VertexIndexMap /* vimap */, VertexIndexMap /* vimap */,
@ -192,20 +196,18 @@ class Circular_border_uniform_parameterizer_3
// Public types // Public types
public: public:
// We have to repeat the types exported by superclass // We have to repeat the types exported by superclass
/// @cond SKIP_IN_MANUAL typedef TriangleMesh_ Triangle_mesh;
typedef TriangleMesh_ TriangleMesh; typedef typename boost::graph_traits<Triangle_mesh>::vertex_descriptor vertex_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor;
/// @endcond
// Private types // Private types
private: private:
typedef Circular_border_parameterizer_3<TriangleMesh> Base; typedef Circular_border_parameterizer_3<Triangle_mesh> Base;
typedef typename Base::NT NT; typedef typename Base::NT NT;
// Protected operations // Protected operations
protected: protected:
/// computes the length of an edge. /// computes the length of an edge.
virtual NT compute_edge_length(const TriangleMesh& /* mesh */, virtual NT compute_edge_length(const Triangle_mesh& /* mesh */,
vertex_descriptor /* source */, vertex_descriptor /* source */,
vertex_descriptor /* target */) const vertex_descriptor /* target */) const
{ {
@ -243,15 +245,13 @@ class Circular_border_arc_length_parameterizer_3
// Public types // Public types
public: public:
// We have to repeat the types exported by superclass // We have to repeat the types exported by superclass
/// @cond SKIP_IN_MANUAL typedef TriangleMesh_ Triangle_mesh;
typedef TriangleMesh_ TriangleMesh; typedef typename boost::graph_traits<Triangle_mesh>::vertex_descriptor vertex_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::halfedge_descriptor halfedge_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor;
/// @endcond
// Private types // Private types
private: private:
typedef Circular_border_parameterizer_3<TriangleMesh> Base; typedef Circular_border_parameterizer_3<Triangle_mesh> Base;
typedef typename Base::PPM PPM; typedef typename Base::PPM PPM;
typedef typename Base::NT NT; typedef typename Base::NT NT;
@ -260,7 +260,7 @@ private:
// Protected operations // Protected operations
protected: protected:
/// computes the length of an edge. /// computes the length of an edge.
virtual NT compute_edge_length(const TriangleMesh& mesh, virtual NT compute_edge_length(const Triangle_mesh& mesh,
vertex_descriptor source, vertex_descriptor source,
vertex_descriptor target) const vertex_descriptor target) const
{ {

View File

@ -48,7 +48,7 @@ namespace Surface_mesh_parameterization {
/// This class is a strategy called by the main /// This class is a strategy called by the main
/// parameterization algorithm `Fixed_border_parameterizer_3::parameterize()` and it: /// parameterization algorithm `Fixed_border_parameterizer_3::parameterize()` and it:
/// - provides the template parameters `BorderParameterizer_` and `SolverTraits_`. /// - provides the template parameters `BorderParameterizer_` and `SolverTraits_`.
/// - implements `compute_w_ij()` to compute `w_ij`, the `(i, j)`-coefficient of the matrix `A` /// - implements `compute_w_ij()` to compute `w_ij`, the `(i,j)`-coefficient of the matrix `A`
/// for `j` neighbor vertex of `i`, based on Discrete Authalic Parameterization algorithm. /// for `j` neighbor vertex of `i`, based on Discrete Authalic Parameterization algorithm.
/// ///
/// \cgalModels `Parameterizer_3` /// \cgalModels `Parameterizer_3`
@ -75,8 +75,8 @@ namespace Surface_mesh_parameterization {
/// \endcode /// \endcode
/// ///
/// \sa `CGAL::Surface_mesh_parameterization::Fixed_border_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>` /// \sa `CGAL::Surface_mesh_parameterization::Fixed_border_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>`
/// \sa `CGAL::Surface_mesh_parameterization::Iterative_authalic_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>`
/// \sa `CGAL::Surface_mesh_parameterization::ARAP_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>` /// \sa `CGAL::Surface_mesh_parameterization::ARAP_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>`
/// \sa `CGAL::Surface_mesh_parameterization::Iterative_authalic_parameterizer_3<TriangleMesh, BorderParameterizer, SolverTraits>`
/// ///
template < class TriangleMesh_, template < class TriangleMesh_,
class BorderParameterizer_ = Default, class BorderParameterizer_ = Default,
@ -114,23 +114,31 @@ public:
#endif #endif
>::type Solver_traits; >::type Solver_traits;
#else #else
/// Border parameterizer type
typedef Border_parameterizer_ Border_parameterizer; typedef Border_parameterizer_ Border_parameterizer;
/// Solver traits type
typedef SolverTraits_ Solver_traits; typedef SolverTraits_ Solver_traits;
#endif #endif
/// Triangle mesh type
typedef TriangleMesh_ Triangle_mesh;
typedef TriangleMesh_ TriangleMesh; typedef TriangleMesh_ TriangleMesh;
/// Mesh vertex type
typedef typename boost::graph_traits<Triangle_mesh>::vertex_descriptor vertex_descriptor;
// Private types // Private types
private: private:
// Superclass // Superclass
typedef Fixed_border_parameterizer_3<TriangleMesh, typedef Fixed_border_parameterizer_3<Triangle_mesh,
Border_parameterizer, Border_parameterizer,
Solver_traits> Base; Solver_traits> Base;
// Private types // Private types
private: private:
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor; typedef CGAL::Vertex_around_target_circulator<Triangle_mesh> vertex_around_target_circulator;
typedef CGAL::Vertex_around_target_circulator<TriangleMesh> vertex_around_target_circulator;
// Traits subtypes: // Traits subtypes:
typedef typename Base::PPM PPM; typedef typename Base::PPM PPM;
@ -150,7 +158,7 @@ public:
///< %Object that maps the surface's border to 2D space. ///< %Object that maps the surface's border to 2D space.
Solver_traits sparse_la = Solver_traits()) Solver_traits sparse_la = Solver_traits())
///< Traits object to access a sparse linear system. ///< Traits object to access a sparse linear system.
: Fixed_border_parameterizer_3<TriangleMesh, : Fixed_border_parameterizer_3<Triangle_mesh,
Border_parameterizer, Border_parameterizer,
Solver_traits>(border_param, sparse_la) Solver_traits>(border_param, sparse_la)
{ } { }
@ -159,14 +167,14 @@ public:
// Protected operations // Protected operations
protected: protected:
/// computes `w_ij`, the (i, j), coefficient of matrix `A` for `j` neighbor vertex of `i`. /// computes `w_ij`, the (i,j), coefficient of matrix `A` for `j` neighbor vertex of `i`.
/// ///
/// \param mesh a triangulated surface. /// \param mesh a triangulated surface.
/// \param main_vertex_v_i the vertex of `mesh` with index `i` /// \param main_vertex_v_i the vertex of `mesh` with index `i`
/// \param neighbor_vertex_v_j the vertex of `mesh` with index `j` /// \param neighbor_vertex_v_j the vertex of `mesh` with index `j`
virtual NT compute_w_ij(const TriangleMesh& mesh, virtual NT compute_w_ij(const Triangle_mesh& mesh,
vertex_descriptor main_vertex_v_i, vertex_descriptor main_vertex_v_i,
vertex_around_target_circulator neighbor_vertex_v_j) const Vertex_around_target_circulator<Triangle_mesh> neighbor_vertex_v_j) const
{ {
const PPM ppmap = get(vertex_point, mesh); const PPM ppmap = get(vertex_point, mesh);

View File

@ -48,7 +48,7 @@ namespace Surface_mesh_parameterization {
/// This class is a strategy called by the main /// This class is a strategy called by the main
/// parameterization algorithm `Fixed_border_parameterizer_3::parameterize()` and it: /// parameterization algorithm `Fixed_border_parameterizer_3::parameterize()` and it:
/// - provides the template parameters `BorderParameterizer_` and `SolverTraits_`. /// - provides the template parameters `BorderParameterizer_` and `SolverTraits_`.
/// - implements `compute_w_ij()` to compute `w_ij`, the `(i, j)`-coefficient of matrix `A`, /// - implements `compute_w_ij()` to compute `w_ij`, the `(i,j)`-coefficient of matrix `A`,
/// for `j` neighbor vertex of `i`, based on Discrete Conformal Map method. /// for `j` neighbor vertex of `i`, based on Discrete Conformal Map method.
/// ///
/// \cgalModels `Parameterizer_3` /// \cgalModels `Parameterizer_3`
@ -112,23 +112,29 @@ public:
#endif #endif
>::type Solver_traits; >::type Solver_traits;
#else #else
/// Border parameterizer type
typedef Border_parameterizer_ Border_parameterizer; typedef Border_parameterizer_ Border_parameterizer;
/// Solver traits type
typedef SolverTraits_ Solver_traits; typedef SolverTraits_ Solver_traits;
#endif #endif
/// Triangle mesh type
typedef TriangleMesh_ Triangle_mesh;
typedef TriangleMesh_ TriangleMesh; typedef TriangleMesh_ TriangleMesh;
// Private types // Private types
private: private:
// Superclass // Superclass
typedef Fixed_border_parameterizer_3<TriangleMesh, typedef Fixed_border_parameterizer_3<Triangle_mesh,
Border_parameterizer, Border_parameterizer,
Solver_traits> Base; Solver_traits> Base;
// Private types // Private types
private: private:
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::vertex_descriptor vertex_descriptor;
typedef CGAL::Vertex_around_target_circulator<TriangleMesh> vertex_around_target_circulator; typedef CGAL::Vertex_around_target_circulator<Triangle_mesh> vertex_around_target_circulator;
// Traits subtypes: // Traits subtypes:
typedef typename Base::Kernel Kernel; typedef typename Base::Kernel Kernel;
@ -148,7 +154,7 @@ public:
///< %Object that maps the surface's border to 2D space. ///< %Object that maps the surface's border to 2D space.
Solver_traits sparse_la = Solver_traits()) Solver_traits sparse_la = Solver_traits())
///< Traits object to access a sparse linear system. ///< Traits object to access a sparse linear system.
: Fixed_border_parameterizer_3<TriangleMesh, : Fixed_border_parameterizer_3<Triangle_mesh,
Border_parameterizer, Border_parameterizer,
Solver_traits>(border_param, sparse_la) Solver_traits>(border_param, sparse_la)
{ } { }
@ -162,9 +168,9 @@ protected:
/// \param mesh a triangulated surface. /// \param mesh a triangulated surface.
/// \param main_vertex_v_i the vertex of `mesh` with index `i` /// \param main_vertex_v_i the vertex of `mesh` with index `i`
/// \param neighbor_vertex_v_j the vertex of `mesh` with index `j` /// \param neighbor_vertex_v_j the vertex of `mesh` with index `j`
virtual NT compute_w_ij(const TriangleMesh& mesh, virtual NT compute_w_ij(const Triangle_mesh& mesh,
vertex_descriptor main_vertex_v_i, vertex_descriptor main_vertex_v_i,
vertex_around_target_circulator neighbor_vertex_v_j) const // its target is main_vertex_v_i Vertex_around_target_circulator<Triangle_mesh> neighbor_vertex_v_j) const // its target is main_vertex_v_i
{ {
const PPM ppmap = get(vertex_point, mesh); const PPM ppmap = get(vertex_point, mesh);

View File

@ -58,7 +58,7 @@ namespace Surface_mesh_parameterization {
/// Nevertheless, it implements most of the parameterization algorithm `parameterize()`. /// Nevertheless, it implements most of the parameterization algorithm `parameterize()`.
/// Subclasses are *Strategies* \cgalCite{cgal:ghjv-dpero-95} that modify the behavior of this algorithm: /// Subclasses are *Strategies* \cgalCite{cgal:ghjv-dpero-95} that modify the behavior of this algorithm:
/// - They provide the template parameters `BorderParameterizer_` and `SolverTraits_`. /// - They provide the template parameters `BorderParameterizer_` and `SolverTraits_`.
/// - They implement `compute_w_ij()` to compute `w_ij`, the `(i, j)`-coefficient of matrix `A`, /// - They implement `compute_w_ij()` to compute `w_ij`, the `(i,j)`-coefficient of matrix `A`
/// for `j` neighbor vertex of `i`. /// for `j` neighbor vertex of `i`.
/// ///
// @todo `Fixed_border_parameterizer_3` should remove border vertices // @todo `Fixed_border_parameterizer_3` should remove border vertices
@ -120,34 +120,44 @@ public:
#endif #endif
>::type Solver_traits; >::type Solver_traits;
#else #else
/// Border parameterizer type
typedef Border_parameterizer_ Border_parameterizer; typedef Border_parameterizer_ Border_parameterizer;
/// Solver traits type
typedef SolverTraits_ Solver_traits; typedef SolverTraits_ Solver_traits;
#endif #endif
/// Triangle mesh type
typedef TriangleMesh_ Triangle_mesh;
typedef TriangleMesh_ TriangleMesh; typedef TriangleMesh_ TriangleMesh;
/// Mesh vertex type
typedef typename boost::graph_traits<Triangle_mesh>::vertex_descriptor vertex_descriptor;
/// Mesh halfedge type
typedef typename boost::graph_traits<Triangle_mesh>::halfedge_descriptor halfedge_descriptor;
/// Solver vector type
typedef typename Solver_traits::Vector Vector;
/// Solver matrix type
typedef typename Solver_traits::Matrix Matrix;
// Private types // Private types
private: private:
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor; typedef CGAL::Vertex_around_target_circulator<Triangle_mesh> vertex_around_target_circulator;
typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor;
typedef CGAL::Vertex_around_target_circulator<TriangleMesh> vertex_around_target_circulator;
typedef CGAL::Vertex_around_face_circulator<TriangleMesh> vertex_around_face_circulator;
// Protected types // Protected types
protected: protected:
// Traits subtypes: // Traits subtypes:
typedef typename internal::Kernel_traits<TriangleMesh>::Kernel Kernel; typedef typename internal::Kernel_traits<Triangle_mesh>::Kernel Kernel;
typedef typename internal::Kernel_traits<TriangleMesh>::PPM PPM; typedef typename internal::Kernel_traits<Triangle_mesh>::PPM PPM;
typedef typename Kernel::FT NT; typedef typename Kernel::FT NT;
typedef typename Kernel::Point_2 Point_2; typedef typename Kernel::Point_2 Point_2;
typedef typename Kernel::Point_3 Point_3; typedef typename Kernel::Point_3 Point_3;
typedef typename Kernel::Vector_3 Vector_3; typedef typename Kernel::Vector_3 Vector_3;
// Solver traits subtypes:
typedef typename Solver_traits::Vector Vector;
typedef typename Solver_traits::Matrix Matrix;
// Public operations // Public operations
public: public:
/// Constructor /// Constructor
@ -169,14 +179,14 @@ public:
/// The result is the `(u,v)` pair image of each vertex of the 3D surface. /// The result is the `(u,v)` pair image of each vertex of the 3D surface.
/// ///
/// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with /// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// %Point_2 (type deduced from `TriangleMesh` using `Kernel_traits`) /// %Point_2 (type deduced from `Triangle_mesh` using `Kernel_traits`)
/// as value type. /// as value type.
/// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with /// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// a unique integer as value type. /// a unique integer as value type.
/// \tparam VertexParameterizedMap must be a model of `ReadWritePropertyMap` with /// \tparam VertexParameterizedMap must be a model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// a Boolean as value type. /// a Boolean as value type.
/// ///
/// \param mesh a triangulated surface. /// \param mesh a triangulated surface.
@ -192,21 +202,21 @@ public:
template <typename VertexUVmap, template <typename VertexUVmap,
typename VertexIndexMap, typename VertexIndexMap,
typename VertexParameterizedMap> typename VertexParameterizedMap>
Error_code parameterize(TriangleMesh& mesh, Error_code parameterize(Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexUVmap uvmap, VertexUVmap uvmap,
VertexIndexMap vimap, VertexIndexMap vimap,
VertexParameterizedMap vpmap) VertexParameterizedMap vpmap)
{ {
CGAL_precondition(is_valid_polygon_mesh(mesh)); CGAL_precondition(is_valid_polygon_mesh(mesh));
CGAL_precondition(bhd != boost::graph_traits<TriangleMesh>::null_halfedge() && is_border(bhd, mesh)); CGAL_precondition(bhd != boost::graph_traits<Triangle_mesh>::null_halfedge() && is_border(bhd, mesh));
Error_code status = OK; Error_code status = OK;
typedef boost::unordered_set<vertex_descriptor> Vertex_set; typedef boost::unordered_set<vertex_descriptor> Vertex_set;
Vertex_set vertices; Vertex_set vertices;
internal::Containers_filler<TriangleMesh> fc(mesh, vertices); internal::Containers_filler<Triangle_mesh> fc(mesh, vertices);
Polygon_mesh_processing::connected_component( Polygon_mesh_processing::connected_component(
face(opposite(bhd, mesh), mesh), face(opposite(bhd, mesh), mesh),
mesh, mesh,
@ -301,11 +311,11 @@ protected:
/// "u = constant" and "v = constant". /// "u = constant" and "v = constant".
/// ///
/// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with /// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// %Point_2 (type deduced from `TriangleMesh` using `Kernel_traits`) /// %Point_2 (type deduced from `Triangle_mesh` using `Kernel_traits`)
/// as value type. /// as value type.
/// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with /// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// a unique integer as value type. /// a unique integer as value type.
/// ///
/// \param A the matrix in both linear system /// \param A the matrix in both linear system
@ -321,7 +331,7 @@ protected:
/// \pre Border vertices must be parameterized. /// \pre Border vertices must be parameterized.
template <typename VertexUVmap, typename VertexIndexMap> template <typename VertexUVmap, typename VertexIndexMap>
void initialize_system_from_mesh_border(Matrix& A, Vector& Bu, Vector& Bv, void initialize_system_from_mesh_border(Matrix& A, Vector& Bu, Vector& Bv,
const TriangleMesh& mesh, const Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexUVmap uvmap, VertexUVmap uvmap,
VertexIndexMap vimap) const VertexIndexMap vimap) const
@ -345,9 +355,9 @@ protected:
/// \param mesh a triangulated surface. /// \param mesh a triangulated surface.
/// \param main_vertex_v_i the vertex of `mesh` with index `i` /// \param main_vertex_v_i the vertex of `mesh` with index `i`
/// \param neighbor_vertex_v_j the vertex of `mesh` with index `j` /// \param neighbor_vertex_v_j the vertex of `mesh` with index `j`
virtual NT compute_w_ij(const TriangleMesh& mesh, virtual NT compute_w_ij(const Triangle_mesh& mesh,
vertex_descriptor main_vertex_v_i, vertex_descriptor main_vertex_v_i,
vertex_around_target_circulator neighbor_vertex_v_j) const = 0; Vertex_around_target_circulator<Triangle_mesh> neighbor_vertex_v_j) const = 0;
/// Compute the line i of matrix A for i inner vertex: /// Compute the line i of matrix A for i inner vertex:
/// - call compute_w_ij() to compute the A coefficient w_ij for each neighbor v_j. /// - call compute_w_ij() to compute the A coefficient w_ij for each neighbor v_j.
@ -362,7 +372,7 @@ protected:
Error_code setup_inner_vertex_relations(Matrix& A, Error_code setup_inner_vertex_relations(Matrix& A,
Vector&, Vector&,
Vector&, Vector&,
const TriangleMesh& mesh, const Triangle_mesh& mesh,
vertex_descriptor vertex, vertex_descriptor vertex,
VertexIndexMap vimap) const VertexIndexMap vimap) const
{ {

View File

@ -97,30 +97,35 @@ public:
#endif #endif
>::type Solver_traits; >::type Solver_traits;
#else #else
/// Border parameterizer type
typedef Border_parameterizer_ Border_parameterizer; typedef Border_parameterizer_ Border_parameterizer;
/// Solver traits type
typedef SolverTraits_ Solver_traits; typedef SolverTraits_ Solver_traits;
#endif #endif
/// Triangle mesh type
typedef TriangleMesh_ Triangle_mesh;
typedef TriangleMesh_ TriangleMesh; typedef TriangleMesh_ TriangleMesh;
// Private types // Private types
private: private:
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::vertex_descriptor vertex_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::halfedge_descriptor halfedge_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::face_descriptor face_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::face_descriptor face_descriptor;
typedef CGAL::Vertex_around_target_circulator<TriangleMesh> vertex_around_target_circulator; typedef CGAL::Vertex_around_target_circulator<Triangle_mesh> vertex_around_target_circulator;
typedef CGAL::Face_around_target_circulator<TriangleMesh> face_around_target_circulator; typedef CGAL::Face_around_target_circulator<Triangle_mesh> face_around_target_circulator;
typedef CGAL::Vertex_around_face_circulator<TriangleMesh> vertex_around_face_circulator;
typedef typename internal::Kernel_traits<TriangleMesh>::Kernel Kernel; typedef typename internal::Kernel_traits<Triangle_mesh>::Kernel Kernel;
typedef typename Kernel::FT NT; typedef typename Kernel::FT NT;
typedef typename Kernel::Point_2 Point_2; typedef typename Kernel::Point_2 Point_2;
typedef typename Kernel::Point_3 Point_3; typedef typename Kernel::Point_3 Point_3;
typedef typename Kernel::Vector_3 Vector_3; typedef typename Kernel::Vector_3 Vector_3;
typedef typename internal::Kernel_traits<TriangleMesh>::PPM PPM; typedef typename internal::Kernel_traits<Triangle_mesh>::PPM PPM;
typedef typename boost::property_traits<PPM>::reference PPM_ref; typedef typename boost::property_traits<PPM>::reference PPM_ref;
typedef std::unordered_set<vertex_descriptor> Vertex_set; typedef std::unordered_set<vertex_descriptor> Vertex_set;
@ -130,15 +135,15 @@ private:
typedef typename Solver_traits::Matrix Matrix; typedef typename Solver_traits::Matrix Matrix;
typedef CGAL::dynamic_vertex_property_t<double> Vertex_double_tag; typedef CGAL::dynamic_vertex_property_t<double> Vertex_double_tag;
typedef typename boost::property_map<TriangleMesh, Vertex_double_tag>::type Vertex_Double_map; typedef typename boost::property_map<Triangle_mesh, Vertex_double_tag>::type Vertex_Double_map;
typedef CGAL::dynamic_vertex_property_t<bool> Vertex_bool_tag; typedef CGAL::dynamic_vertex_property_t<bool> Vertex_bool_tag;
typedef typename boost::property_map<TriangleMesh, Vertex_bool_tag>::type Vertex_bool_map; typedef typename boost::property_map<Triangle_mesh, Vertex_bool_tag>::type Vertex_bool_map;
typedef CGAL::dynamic_vertex_property_t<int> Vertex_int_tag; typedef CGAL::dynamic_vertex_property_t<int> Vertex_int_tag;
typedef typename boost::property_map<TriangleMesh, Vertex_int_tag>::type Vertex_int_map; typedef typename boost::property_map<Triangle_mesh, Vertex_int_tag>::type Vertex_int_map;
typedef CGAL::dynamic_vertex_property_t<Point_2> Vertex_point2_tag; typedef CGAL::dynamic_vertex_property_t<Point_2> Vertex_point2_tag;
typedef typename boost::property_map<TriangleMesh, Vertex_point2_tag>::type Vertex_point2_map; typedef typename boost::property_map<Triangle_mesh, Vertex_point2_tag>::type Vertex_point2_map;
typedef CGAL::dynamic_face_property_t<NT> Face_NT_tag; typedef CGAL::dynamic_face_property_t<NT> Face_NT_tag;
typedef typename boost::property_map<TriangleMesh, Face_NT_tag>::type Face_NT_map; typedef typename boost::property_map<Triangle_mesh, Face_NT_tag>::type Face_NT_map;
// Fields // Fields
private: private:
@ -171,7 +176,6 @@ public:
/// Constructor /// Constructor
/// ///
/// \param border_parameterizer %Object that maps the surface's border to 2D space /// \param border_parameterizer %Object that maps the surface's border to 2D space
/// \param iterations an integer number of iterations to run the parameterization
/// \param sparse_la Traits object to access a sparse linear system /// \param sparse_la Traits object to access a sparse linear system
/// ///
Iterative_authalic_parameterizer_3(Border_parameterizer border_parameterizer = Border_parameterizer(), Iterative_authalic_parameterizer_3(Border_parameterizer border_parameterizer = Border_parameterizer(),
@ -191,7 +195,7 @@ public:
template <typename FaceRange, typename VertexUVmap> template <typename FaceRange, typename VertexUVmap>
NT compute_area_distortion(const FaceRange& face_range, NT compute_area_distortion(const FaceRange& face_range,
const NT A_3D, const NT A_3D,
TriangleMesh& tmesh, Triangle_mesh& tmesh,
const VertexUVmap uvmap) const VertexUVmap uvmap)
{ {
Face_NT_map area_2DMap = get(Face_NT_tag(), tmesh); Face_NT_map area_2DMap = get(Face_NT_tag(), tmesh);
@ -292,7 +296,7 @@ protected:
template <typename VertexIndexMap> template <typename VertexIndexMap>
void copy_sparse_matrix(const Matrix& src, void copy_sparse_matrix(const Matrix& src,
Matrix& dest, Matrix& dest,
const TriangleMesh& tmesh, const Triangle_mesh& tmesh,
const Vertex_set& vertices, const Vertex_set& vertices,
const VertexIndexMap vimap) const VertexIndexMap vimap)
{ {
@ -312,14 +316,14 @@ protected:
} }
private: private:
double compute_vertex_L2(const TriangleMesh& tmesh, double compute_vertex_L2(const Triangle_mesh& tmesh,
const vertex_descriptor v) const const vertex_descriptor v) const
{ {
NT phi = 0, local_area = 0; NT phi = 0, local_area = 0;
for(face_descriptor f : CGAL::faces_around_target(halfedge(v, tmesh), tmesh)) for(face_descriptor f : CGAL::faces_around_target(halfedge(v, tmesh), tmesh))
{ {
if(f == boost::graph_traits<TriangleMesh>::null_face()) if(f == boost::graph_traits<Triangle_mesh>::null_face())
continue; continue;
phi += CGAL::square(get(m_face_L2_map, f)) * get(m_face_areas, f); phi += CGAL::square(get(m_face_L2_map, f)) * get(m_face_areas, f);
@ -330,7 +334,7 @@ private:
} }
void compute_vertices_L2(const Vertex_set& vertices, void compute_vertices_L2(const Vertex_set& vertices,
TriangleMesh& tmesh) Triangle_mesh& tmesh)
{ {
m_vertex_L2_map = get(Vertex_double_tag(), tmesh); m_vertex_L2_map = get(Vertex_double_tag(), tmesh);
for(vertex_descriptor v : vertices) for(vertex_descriptor v : vertices)
@ -385,7 +389,7 @@ private:
template <typename VertexUVMap> template <typename VertexUVMap>
NT compute_face_L2(const face_descriptor f, NT compute_face_L2(const face_descriptor f,
const TriangleMesh& tmesh, const Triangle_mesh& tmesh,
const VertexUVMap uvmap, const VertexUVMap uvmap,
const PPM ppmap) const const PPM ppmap) const
{ {
@ -418,7 +422,7 @@ private:
template <typename FaceRange, typename VertexUVMap> template <typename FaceRange, typename VertexUVMap>
void compute_faces_L2(const FaceRange& face_range, void compute_faces_L2(const FaceRange& face_range,
TriangleMesh& tmesh, Triangle_mesh& tmesh,
const VertexUVMap uvmap) const VertexUVMap uvmap)
{ {
m_face_L2_map = get(Face_NT_tag(), tmesh); m_face_L2_map = get(Face_NT_tag(), tmesh);
@ -433,7 +437,7 @@ private:
template <typename FaceRange> template <typename FaceRange>
NT initialize_faces_areas(const FaceRange& face_range, NT initialize_faces_areas(const FaceRange& face_range,
TriangleMesh& tmesh) Triangle_mesh& tmesh)
{ {
m_face_areas = get(Face_NT_tag(), tmesh); m_face_areas = get(Face_NT_tag(), tmesh);
NT total_area = 0; NT total_area = 0;
@ -490,7 +494,7 @@ private:
Matrix& A_prev, Matrix& A_prev,
Vector&, Vector&,
Vector&, Vector&,
const TriangleMesh& tmesh, const Triangle_mesh& tmesh,
vertex_descriptor v, vertex_descriptor v,
VertexIndexMap vimap) VertexIndexMap vimap)
{ {
@ -613,9 +617,9 @@ private:
/// \param mesh a triangulated surface. /// \param mesh a triangulated surface.
/// \param main_vertex_v_i the vertex of `mesh` with index `i` /// \param main_vertex_v_i the vertex of `mesh` with index `i`
/// \param neighbor_vertex_v_j the vertex of `mesh` with index `j` /// \param neighbor_vertex_v_j the vertex of `mesh` with index `j`
NT compute_w_ij(const TriangleMesh& tmesh, NT compute_w_ij(const Triangle_mesh& tmesh,
vertex_descriptor main_vertex_v_i, vertex_descriptor main_vertex_v_i,
vertex_around_target_circulator neighbor_vertex_v_j) const Vertex_around_target_circulator<Triangle_mesh> neighbor_vertex_v_j) const
{ {
const PPM ppmap = get(vertex_point, tmesh); const PPM ppmap = get(vertex_point, tmesh);
@ -655,7 +659,7 @@ private:
Error_code setup_inner_vertex_relations_cotangent(Matrix& A, Error_code setup_inner_vertex_relations_cotangent(Matrix& A,
Vector&, Vector&,
Vector&, Vector&,
const TriangleMesh& tmesh, const Triangle_mesh& tmesh,
vertex_descriptor v, vertex_descriptor v,
VertexIndexMap& vimap) VertexIndexMap& vimap)
{ {
@ -706,12 +710,12 @@ private:
Error_code setup_inner_vertex_relations_MVC(Matrix& A, Error_code setup_inner_vertex_relations_MVC(Matrix& A,
Vector&, Vector&,
Vector&, Vector&,
TriangleMesh& tmesh, Triangle_mesh& tmesh,
vertex_descriptor v, vertex_descriptor v,
VertexIndexMap& vimap) const VertexIndexMap& vimap) const
{ {
auto vpm = get_const_property_map(CGAL::vertex_point, tmesh); auto vpm = get_const_property_map(CGAL::vertex_point, tmesh);
CGAL::internal::Mean_value_weight<TriangleMesh, decltype(vpm)> compute_mvc(tmesh, vpm); CGAL::internal::Mean_value_weight<Triangle_mesh, decltype(vpm)> compute_mvc(tmesh, vpm);
const int i = get(vimap, v); const int i = get(vimap, v);
@ -746,7 +750,7 @@ private:
Matrix& A_prev, Matrix& A_prev,
Vector&, Vector&,
Vector&, Vector&,
const TriangleMesh& tmesh, const Triangle_mesh& tmesh,
vertex_descriptor v, vertex_descriptor v,
VertexIndexMap vimap, VertexIndexMap vimap,
NT gamma) NT gamma)
@ -806,27 +810,27 @@ public:
/// "u = constant" and "v = constant". /// "u = constant" and "v = constant".
/// ///
/// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with /// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// %Point_2 (type deduced from `TriangleMesh` using `Kernel_traits`) /// %Point_2 (type deduced from `Triangle_mesh` using `Kernel_traits`)
/// as value type. /// as value type.
/// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with /// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// a unique integer as value type. /// a unique integer as value type.
/// ///
/// \param A the matrix in both linear system /// \param A the matrix in both linear system
/// \param Bu the right hand side vector in the linear system of x coordinates /// \param Bu the right hand side vector in the linear system of x coordinates
/// \param Bv the right hand side vector in the linear system of y coordinates /// \param Bv the right hand side vector in the linear system of y coordinates
/// \param mesh a triangulated surface. /// \param tmesh a triangulated surface
/// \param bhd a halfedge descriptor on the boundary of `mesh`. /// \param bhd a halfedge descriptor on the boundary of `mesh`
/// \param uvmap an instanciation of the class `VertexUVmap`. /// \param uvmap an instanciation of the class `VertexUVmap`
/// \param vimap an instanciation of the class `VertexIndexMap`. /// \param vimap an instanciation of the class `VertexIndexMap`
/// ///
/// \pre Vertices must be indexed (`vimap` must be initialized). /// \pre Vertices must be indexed (`vimap` must be initialized).
/// \pre `A`, `Bu`, and `Bv` must be allocated. /// \pre `A`, `Bu`, and `Bv` must be allocated.
/// \pre Border vertices must be parameterized. /// \pre Border vertices must be parameterized.
template <typename VertexUVmap, typename VertexIndexMap> template <typename VertexUVmap, typename VertexIndexMap>
void initialize_system_from_mesh_border(Matrix& A, Vector& Bu, Vector& Bv, void initialize_system_from_mesh_border(Matrix& A, Vector& Bu, Vector& Bv,
const TriangleMesh& tmesh, const Triangle_mesh& tmesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexUVmap uvmap, VertexUVmap uvmap,
VertexIndexMap vimap) const VertexIndexMap vimap) const
@ -853,14 +857,14 @@ public:
/// The result is the `(u,v)` pair image of each vertex of the 3D surface. /// The result is the `(u,v)` pair image of each vertex of the 3D surface.
/// ///
/// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with /// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// %Point_2 (type deduced from `TriangleMesh` using `Kernel_traits`) /// %Point_2 (type deduced from `Triangle_mesh` using `Kernel_traits`)
/// as value type. /// as value type.
/// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with /// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// a unique integer as value type. /// a unique integer as value type.
/// \tparam VertexParameterizedMap must be a model of `ReadWritePropertyMap` with /// \tparam VertexParameterizedMap must be a model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// a Boolean as value type. /// a Boolean as value type.
/// ///
/// \param tmesh a triangulated surface /// \param tmesh a triangulated surface
@ -878,7 +882,7 @@ public:
template <typename VertexUVmap, template <typename VertexUVmap,
typename VertexIndexMap, typename VertexIndexMap,
typename VertexParameterizedMap> typename VertexParameterizedMap>
Error_code parameterize(TriangleMesh& tmesh, Error_code parameterize(Triangle_mesh& tmesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexUVmap uvmap, VertexUVmap uvmap,
VertexIndexMap vimap, VertexIndexMap vimap,
@ -895,7 +899,7 @@ public:
std::vector<face_descriptor> cc_faces; std::vector<face_descriptor> cc_faces;
cc_faces.reserve(num_faces(tmesh)); cc_faces.reserve(num_faces(tmesh));
internal::Containers_filler<TriangleMesh, Vertex_set> fc(tmesh, cc_vertices, &cc_faces); internal::Containers_filler<Triangle_mesh, Vertex_set> fc(tmesh, cc_vertices, &cc_faces);
Polygon_mesh_processing::connected_component(face(opposite(bhd, tmesh), tmesh), tmesh, Polygon_mesh_processing::connected_component(face(opposite(bhd, tmesh), tmesh), tmesh,
boost::make_function_output_iterator(fc)); boost::make_function_output_iterator(fc));
@ -954,7 +958,7 @@ public:
{ {
#if 0 #if 0
status = setup_inner_vertex_relations(A, A_prev, Bu, Bv, tmesh, v, vimap); status = setup_inner_vertex_relations(A, A_prev, Bu, Bv, tmesh, v, vimap);
#elif 0 #elif 1
status = setup_inner_vertex_relations_cotangent(A, Bu, Bv, tmesh, v, vimap); status = setup_inner_vertex_relations_cotangent(A, Bu, Bv, tmesh, v, vimap);
#else #else
status = setup_inner_vertex_relations_MVC(A, Bu, Bv, tmesh, v, vimap); status = setup_inner_vertex_relations_MVC(A, Bu, Bv, tmesh, v, vimap);
@ -1092,7 +1096,7 @@ public:
template <typename VertexUVmap, template <typename VertexUVmap,
typename VertexIndexMap, typename VertexIndexMap,
typename VertexParameterizedMap> typename VertexParameterizedMap>
Error_code parameterize(TriangleMesh& tmesh, Error_code parameterize(Triangle_mesh& tmesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexUVmap uvmap, VertexUVmap uvmap,
VertexIndexMap vimap, VertexIndexMap vimap,
@ -1106,7 +1110,7 @@ public:
template <typename VertexUVmap, template <typename VertexUVmap,
typename VertexIndexMap, typename VertexIndexMap,
typename VertexParameterizedMap> typename VertexParameterizedMap>
Error_code parameterize(TriangleMesh& tmesh, Error_code parameterize(Triangle_mesh& tmesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexUVmap uvmap, VertexUVmap uvmap,
VertexIndexMap vimap, VertexIndexMap vimap,
@ -1118,7 +1122,7 @@ public:
} }
template <typename VertexUVmap> template <typename VertexUVmap>
Error_code parameterize(TriangleMesh& tmesh, Error_code parameterize(Triangle_mesh& tmesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexUVmap uvmap, VertexUVmap uvmap,
const int iterations = 15) const int iterations = 15)

View File

@ -75,7 +75,7 @@ namespace Surface_mesh_parameterization {
/// and `CGAL_EIGEN3_ENABLED` is defined, then an overload of `Eigen_solver_traits` /// and `CGAL_EIGEN3_ENABLED` is defined, then an overload of `Eigen_solver_traits`
/// is provided as default parameter: /// is provided as default parameter:
/// \code /// \code
/// CGAL::Eigen_solver_traits<Eigen::BICGSTAB< Eigen::SparseMatrix<double> > > /// CGAL::Eigen_solver_traits<Eigen::SimplicialLDLT< Eigen::SparseMatrix<double> > >
/// \endcode /// \endcode
/// Otherwise, it uses CGAL's wrapping function to the OpenNL library: /// Otherwise, it uses CGAL's wrapping function to the OpenNL library:
/// \code /// \code
@ -100,12 +100,7 @@ public:
#if defined(CGAL_EIGEN3_ENABLED) #if defined(CGAL_EIGEN3_ENABLED)
// WARNING: at the moment, the choice of SolverTraits_ is completely // WARNING: at the moment, the choice of SolverTraits_ is completely
// ignored (see LeastSquaresSolver typedef) and `OpenNL::LinearSolver<SolverTraits_>` // ignored (see LeastSquaresSolver typedef) and `OpenNL::LinearSolver<SolverTraits_>`
// is used anyway. If Eigen solver traits were to be used again, there is a bug // is always used...
// in the line below to be first fixed:
// `Eigen_sparse_symmetric_matrix<double>::EigenType` is a NON SYMMETRIC
// Eigen sparse matrix, and thus SolverTraits_::Matrix will be a NON SYMMETRIC matrix
// and the whole symmetry aspect will be completely ignored.
// @fixme
CGAL::Eigen_solver_traits< CGAL::Eigen_solver_traits<
Eigen::SimplicialLDLT<Eigen_sparse_symmetric_matrix<double>::EigenType> > Eigen::SimplicialLDLT<Eigen_sparse_symmetric_matrix<double>::EigenType> >
#else #else
@ -113,24 +108,29 @@ public:
#endif #endif
>::type Solver_traits; >::type Solver_traits;
#else #else
/// The border parameterizer
typedef Border_parameterizer_ Border_parameterizer; typedef Border_parameterizer_ Border_parameterizer;
/// Solver traits type
typedef SolverTraits_ Solver_traits; typedef SolverTraits_ Solver_traits;
#endif #endif
/// Triangle mesh type
typedef TriangleMesh_ Triangle_mesh;
typedef TriangleMesh_ TriangleMesh; typedef TriangleMesh_ TriangleMesh;
/// Mesh halfedge type
typedef typename boost::graph_traits<Triangle_mesh>::halfedge_descriptor halfedge_descriptor;
// Private types // Private types
private: private:
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::vertex_descriptor vertex_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::face_descriptor face_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::face_descriptor face_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::vertex_iterator vertex_iterator;
typedef typename boost::graph_traits<TriangleMesh>::face_iterator face_iterator;
// Traits subtypes: // Traits subtypes:
typedef typename internal::Kernel_traits<TriangleMesh>::PPM PPM; typedef typename internal::Kernel_traits<Triangle_mesh>::PPM PPM;
typedef typename internal::Kernel_traits<TriangleMesh>::Kernel Kernel; typedef typename internal::Kernel_traits<Triangle_mesh>::Kernel Kernel;
typedef typename Kernel::FT NT; typedef typename Kernel::FT NT;
typedef typename Kernel::Point_2 Point_2; typedef typename Kernel::Point_2 Point_2;
typedef typename Kernel::Point_3 Point_3; typedef typename Kernel::Point_3 Point_3;
@ -157,7 +157,7 @@ public:
/// returns whether the 3D -> 2D mapping is one-to-one. /// returns whether the 3D -> 2D mapping is one-to-one.
template <typename VertexUVMap> template <typename VertexUVMap>
bool is_one_to_one_mapping(const TriangleMesh& mesh, bool is_one_to_one_mapping(const Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
const VertexUVMap uvmap) const const VertexUVMap uvmap) const
{ {
@ -170,14 +170,14 @@ public:
/// The result is the `(u,v)` pair image of each vertex of the 3D surface. /// The result is the `(u,v)` pair image of each vertex of the 3D surface.
/// ///
/// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with /// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// %Point_2 (type deduced from `TriangleMesh` using `Kernel_traits`) /// %Point_2 (type deduced from `Triangle_mesh` using `Kernel_traits`)
/// as value type. /// as value type.
/// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with /// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// a unique integer as value type. /// a unique integer as value type.
/// \tparam VertexParameterizedMap must be a model of `ReadWritePropertyMap` with /// \tparam VertexParameterizedMap must be a model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// a Boolean as value type. /// a Boolean as value type.
/// ///
/// \param mesh a triangulated surface. /// \param mesh a triangulated surface.
@ -190,20 +190,20 @@ public:
/// \pre The vertices must be indexed (`vimap` must be initialized). /// \pre The vertices must be indexed (`vimap` must be initialized).
/// ///
template <typename VertexUVmap, typename VertexIndexMap, typename VertexParameterizedMap> template <typename VertexUVmap, typename VertexIndexMap, typename VertexParameterizedMap>
Error_code parameterize(TriangleMesh& mesh, Error_code parameterize(Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexUVmap uvmap, VertexUVmap uvmap,
VertexIndexMap vimap, VertexIndexMap vimap,
VertexParameterizedMap vpmap) VertexParameterizedMap vpmap)
{ {
CGAL_precondition(is_valid_polygon_mesh(mesh)); CGAL_precondition(is_valid_polygon_mesh(mesh));
CGAL_precondition(bhd != boost::graph_traits<TriangleMesh>::null_halfedge() && is_border(bhd, mesh)); CGAL_precondition(bhd != boost::graph_traits<Triangle_mesh>::null_halfedge() && is_border(bhd, mesh));
// Fill containers // Fill containers
boost::unordered_set<vertex_descriptor> ccvertices; boost::unordered_set<vertex_descriptor> ccvertices;
std::vector<face_descriptor> ccfaces; std::vector<face_descriptor> ccfaces;
internal::Containers_filler<TriangleMesh> fc(mesh, ccvertices, &ccfaces); internal::Containers_filler<Triangle_mesh> fc(mesh, ccvertices, &ccfaces);
Polygon_mesh_processing::connected_component( Polygon_mesh_processing::connected_component(
face(opposite(bhd, mesh), mesh), face(opposite(bhd, mesh), mesh),
mesh, mesh,
@ -343,7 +343,7 @@ private:
// in presence of degenerate triangles // in presence of degenerate triangles
template <typename VertexIndexMap > template <typename VertexIndexMap >
Error_code setup_triangle_relations(LeastSquaresSolver& solver, Error_code setup_triangle_relations(LeastSquaresSolver& solver,
const TriangleMesh& mesh, const Triangle_mesh& mesh,
face_descriptor facet, face_descriptor facet,
VertexIndexMap vimap) const VertexIndexMap vimap) const
{ {

View File

@ -93,29 +93,33 @@ public:
#endif #endif
>::type Solver_traits; >::type Solver_traits;
#else #else
/// Solver traits type
typedef SolverTraits_ Solver_traits; typedef SolverTraits_ Solver_traits;
#endif #endif
/// Triangle mesh type
typedef TriangleMesh_ Triangle_mesh;
typedef TriangleMesh_ TriangleMesh; typedef TriangleMesh_ TriangleMesh;
// Private types // Private types
private: private:
// This class // This class
typedef MVC_post_processor_3<TriangleMesh, Solver_traits> Self; typedef MVC_post_processor_3<Triangle_mesh, Solver_traits> Self;
// Private types // Private types
private: private:
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::vertex_descriptor vertex_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::halfedge_descriptor halfedge_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::face_descriptor face_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::face_descriptor face_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::face_iterator face_iterator; typedef typename boost::graph_traits<Triangle_mesh>::face_iterator face_iterator;
typedef typename boost::graph_traits<TriangleMesh>::vertex_iterator vertex_iterator; typedef typename boost::graph_traits<Triangle_mesh>::vertex_iterator vertex_iterator;
typedef boost::unordered_set<vertex_descriptor> Vertex_set; typedef boost::unordered_set<vertex_descriptor> Vertex_set;
typedef std::vector<face_descriptor> Faces_vector; typedef std::vector<face_descriptor> Faces_vector;
// Traits subtypes: // Traits subtypes:
typedef typename internal::Kernel_traits<TriangleMesh>::Kernel Kernel; typedef typename internal::Kernel_traits<Triangle_mesh>::Kernel Kernel;
typedef typename Kernel::FT NT; typedef typename Kernel::FT NT;
typedef typename Kernel::Point_2 Point_2; typedef typename Kernel::Point_2 Point_2;
typedef typename Kernel::Vector_2 Vector_2; typedef typename Kernel::Vector_2 Vector_2;
@ -189,12 +193,12 @@ private:
// Private operations // Private operations
private: private:
// Store the vertices and faces of the mesh in memory. // Store the vertices and faces of the mesh in memory.
void initialize_containers(const TriangleMesh& mesh, void initialize_containers(const Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
Vertex_set& vertices, Vertex_set& vertices,
Faces_vector& faces) const Faces_vector& faces) const
{ {
internal::Containers_filler<TriangleMesh> fc(mesh, vertices, &faces); internal::Containers_filler<Triangle_mesh> fc(mesh, vertices, &faces);
CGAL::Polygon_mesh_processing::connected_component( CGAL::Polygon_mesh_processing::connected_component(
face(opposite(bhd, mesh), mesh), face(opposite(bhd, mesh), mesh),
mesh, mesh,
@ -203,7 +207,7 @@ private:
// Checks whether the polygon's border is simple. // Checks whether the polygon's border is simple.
template <typename VertexUVMap> template <typename VertexUVMap>
bool is_polygon_simple(const TriangleMesh& mesh, bool is_polygon_simple(const Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
const VertexUVMap uvmap) const const VertexUVMap uvmap) const
{ {
@ -273,7 +277,7 @@ private:
// Triangulate the convex hull of the border of the parameterization. // Triangulate the convex hull of the border of the parameterization.
template <typename CT, template <typename CT,
typename VertexUVMap> typename VertexUVMap>
Error_code triangulate_convex_hull(const TriangleMesh& mesh, Error_code triangulate_convex_hull(const Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
const VertexUVMap uvmap, const VertexUVMap uvmap,
CT& ct) const CT& ct) const
@ -506,7 +510,7 @@ private:
template <typename VertexUVMap, template <typename VertexUVMap,
typename VertexIndexMap, typename VertexIndexMap,
typename VertexParameterizedMap> typename VertexParameterizedMap>
void fill_linear_system_matrix_mvc_from_mesh_halfedge(const TriangleMesh& mesh, void fill_linear_system_matrix_mvc_from_mesh_halfedge(const Triangle_mesh& mesh,
halfedge_descriptor hd, halfedge_descriptor hd,
const VertexUVMap uvmap, const VertexUVMap uvmap,
const VertexIndexMap vimap, const VertexIndexMap vimap,
@ -539,7 +543,7 @@ private:
template <typename VertexUVMap, template <typename VertexUVMap,
typename VertexIndexMap, typename VertexIndexMap,
typename VertexParameterizedMap> typename VertexParameterizedMap>
void fill_linear_system_matrix_mvc_from_mesh_face(const TriangleMesh& mesh, void fill_linear_system_matrix_mvc_from_mesh_face(const Triangle_mesh& mesh,
face_descriptor fd, face_descriptor fd,
const VertexUVMap uvmap, const VertexUVMap uvmap,
const VertexIndexMap vimap, const VertexIndexMap vimap,
@ -562,7 +566,7 @@ private:
typename VertexIndexMap, typename VertexIndexMap,
typename VertexParameterizedMap> typename VertexParameterizedMap>
Error_code compute_mvc_matrix(const CT& ct, Error_code compute_mvc_matrix(const CT& ct,
const TriangleMesh& mesh, const Triangle_mesh& mesh,
const Faces_vector& faces, const Faces_vector& faces,
const VertexUVMap uvmap, const VertexUVMap uvmap,
const VertexIndexMap vimap, const VertexIndexMap vimap,
@ -660,7 +664,7 @@ private:
typename VertexUVMap, typename VertexUVMap,
typename VertexIndexMap, typename VertexIndexMap,
typename VertexParameterizedMap> typename VertexParameterizedMap>
Error_code parameterize_convex_hull_with_MVC(const TriangleMesh& mesh, Error_code parameterize_convex_hull_with_MVC(const Triangle_mesh& mesh,
const Vertex_set& vertices, const Vertex_set& vertices,
const Faces_vector& faces, const Faces_vector& faces,
const CT& ct, const CT& ct,
@ -707,7 +711,7 @@ private:
public: public:
template <typename VertexUVMap, template <typename VertexUVMap,
typename VertexIndexMap> typename VertexIndexMap>
Error_code parameterize(const TriangleMesh& mesh, Error_code parameterize(const Triangle_mesh& mesh,
const Vertex_set& vertices, const Vertex_set& vertices,
const Faces_vector& faces, const Faces_vector& faces,
halfedge_descriptor bhd, halfedge_descriptor bhd,
@ -745,11 +749,11 @@ public:
/// that is not necessarily embedded to a piece of the 2D space. /// that is not necessarily embedded to a piece of the 2D space.
/// ///
/// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with /// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// %Point_2 (type deduced from `TriangleMesh` using `Kernel_traits`) /// %Point_2 (type deduced from `Triangle_mesh` using `Kernel_traits`)
/// as value type. /// as value type.
/// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with /// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// a unique integer as value type. /// a unique integer as value type.
/// ///
/// \param mesh a triangulated surface. /// \param mesh a triangulated surface.
@ -759,7 +763,7 @@ public:
/// ///
template <typename VertexUVMap, template <typename VertexUVMap,
typename VertexIndexMap> typename VertexIndexMap>
Error_code parameterize(const TriangleMesh& mesh, Error_code parameterize(const Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexUVMap uvmap, VertexUVMap uvmap,
const VertexIndexMap vimap) const VertexIndexMap vimap)

View File

@ -45,8 +45,8 @@ namespace Surface_mesh_parameterization {
/// `Fixed_border_parameterizer_3::parameterize()`. /// `Fixed_border_parameterizer_3::parameterize()`.
/// - It provides default `BorderParameterizer_` and `SolverTraits_` template /// - It provides default `BorderParameterizer_` and `SolverTraits_` template
/// parameters. /// parameters.
/// - It implements `compute_w_ij()` to compute w_ij = (i, j) coefficient of matrix A /// - It implements `compute_w_ij()` to compute `w_ij`, the `(i,j)` coefficient of matrix `A`
/// for j neighbor vertex of i based on Floater Mean Value Coordinates parameterization. /// for `j` neighbor vertex of `i` based on Floater Mean Value Coordinates parameterization.
/// - It implements an optimized version of `is_one_to_one_mapping()`. /// - It implements an optimized version of `is_one_to_one_mapping()`.
/// ///
/// \cgalModels `Parameterizer_3` /// \cgalModels `Parameterizer_3`
@ -110,28 +110,38 @@ public:
#endif #endif
>::type Solver_traits; >::type Solver_traits;
#else #else
/// The border parameterizer
typedef Border_parameterizer_ Border_parameterizer; typedef Border_parameterizer_ Border_parameterizer;
/// Solver traits type
typedef SolverTraits_ Solver_traits; typedef SolverTraits_ Solver_traits;
#endif #endif
/// Triangle mesh type
typedef TriangleMesh_ Triangle_mesh;
typedef TriangleMesh_ TriangleMesh; typedef TriangleMesh_ TriangleMesh;
/// Mesh vertex type
typedef typename boost::graph_traits<Triangle_mesh>::vertex_descriptor vertex_descriptor;
/// Mesh halfedge type
typedef typename boost::graph_traits<Triangle_mesh>::halfedge_descriptor halfedge_descriptor;
// Private types // Private types
private: private:
// Superclass // Superclass
typedef Fixed_border_parameterizer_3<TriangleMesh, typedef Fixed_border_parameterizer_3<Triangle_mesh,
Border_parameterizer, Border_parameterizer,
Solver_traits> Base; Solver_traits> Base;
// Private types // Private types
private: private:
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::face_descriptor face_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::face_descriptor face_descriptor;
typedef typename boost::graph_traits<TriangleMesh>::vertex_iterator vertex_iterator; typedef typename boost::graph_traits<Triangle_mesh>::vertex_iterator vertex_iterator;
typedef typename boost::graph_traits<TriangleMesh>::face_iterator face_iterator; typedef typename boost::graph_traits<Triangle_mesh>::face_iterator face_iterator;
typedef CGAL::Vertex_around_target_circulator<TriangleMesh> vertex_around_target_circulator; typedef CGAL::Vertex_around_target_circulator<Triangle_mesh> vertex_around_target_circulator;
// Mesh_TriangleMesh_3 subtypes: // Mesh_TriangleMesh_3 subtypes:
typedef typename Base::PPM PPM; typedef typename Base::PPM PPM;
@ -140,7 +150,6 @@ private:
typedef typename Base::Point_3 Point_3; typedef typename Base::Point_3 Point_3;
typedef typename Base::Vector_3 Vector_3; typedef typename Base::Vector_3 Vector_3;
// Solver traits subtypes:
typedef typename Solver_traits::Vector Vector; typedef typename Solver_traits::Vector Vector;
typedef typename Solver_traits::Matrix Matrix; typedef typename Solver_traits::Matrix Matrix;
@ -151,7 +160,7 @@ public:
///< Object that maps the surface's border to 2D space. ///< Object that maps the surface's border to 2D space.
Solver_traits sparse_la = Solver_traits()) Solver_traits sparse_la = Solver_traits())
///< Traits object to access a sparse linear system. ///< Traits object to access a sparse linear system.
: Fixed_border_parameterizer_3<TriangleMesh, : Fixed_border_parameterizer_3<Triangle_mesh,
Border_parameterizer, Border_parameterizer,
Solver_traits>(border_param, sparse_la) Solver_traits>(border_param, sparse_la)
{ } { }
@ -160,7 +169,7 @@ public:
/// returns whether the 3D -> 2D mapping is one-to-one. /// returns whether the 3D -> 2D mapping is one-to-one.
template <typename VertexUVMap> template <typename VertexUVMap>
bool is_one_to_one_mapping(const TriangleMesh& mesh, bool is_one_to_one_mapping(const Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
const VertexUVMap uvmap) const const VertexUVMap uvmap) const
{ {
@ -181,9 +190,9 @@ protected:
/// \param mesh a triangulated surface. /// \param mesh a triangulated surface.
/// \param main_vertex_v_i the vertex of `mesh` with index `i` /// \param main_vertex_v_i the vertex of `mesh` with index `i`
/// \param neighbor_vertex_v_j the vertex of `mesh` with index `j` /// \param neighbor_vertex_v_j the vertex of `mesh` with index `j`
virtual NT compute_w_ij(const TriangleMesh& mesh, virtual NT compute_w_ij(const Triangle_mesh& mesh,
vertex_descriptor main_vertex_v_i, vertex_descriptor main_vertex_v_i,
vertex_around_target_circulator neighbor_vertex_v_j) const Vertex_around_target_circulator<Triangle_mesh> neighbor_vertex_v_j) const
{ {
const PPM ppmap = get(vertex_point, mesh); const PPM ppmap = get(vertex_point, mesh);

View File

@ -202,7 +202,7 @@ Error_code read_cones(const TriangleMesh& tm, const char* filename, ConeOutputIt
/// but is passed here as a template parameter for convenience, to avoid /// but is passed here as a template parameter for convenience, to avoid
/// having to pass the multiple template parameters of the class `CGAL::Seam_mesh`. /// having to pass the multiple template parameters of the class `CGAL::Seam_mesh`.
/// \tparam ConeInputBidirectionalIterator must be a model of `BidirectionalIterator` /// \tparam ConeInputBidirectionalIterator must be a model of `BidirectionalIterator`
/// with value type `boost::graph_traits<SeamMesh::TriangleMesh>::%vertex_descriptor`. /// with value type `boost::graph_traits<SeamMesh::Triangle_mesh>::%vertex_descriptor`.
/// \tparam ConeMap must be a model of `AssociativeContainer` /// \tparam ConeMap must be a model of `AssociativeContainer`
/// with `boost::graph_traits<SeamMesh>::%vertex_descriptor` as key type and /// with `boost::graph_traits<SeamMesh>::%vertex_descriptor` as key type and
/// \link PkgSurfaceMeshParameterizationEnums Cone_type \endlink as value type. /// \link PkgSurfaceMeshParameterizationEnums Cone_type \endlink as value type.
@ -216,13 +216,13 @@ bool locate_cones(const SeamMesh& mesh,
ConeInputBidirectionalIterator first, ConeInputBidirectionalIterator beyond, ConeInputBidirectionalIterator first, ConeInputBidirectionalIterator beyond,
ConeMap& cones) ConeMap& cones)
{ {
typedef typename SeamMesh::TriangleMesh TriangleMesh; typedef typename SeamMesh::Triangle_mesh Triangle_mesh;
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor TM_vertex_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::vertex_descriptor TM_vertex_descriptor;
typedef typename boost::graph_traits<SeamMesh>::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits<SeamMesh>::vertex_descriptor vertex_descriptor;
// property map to go from TM_vertex_descriptor to Point_3 // property map to go from TM_vertex_descriptor to Point_3
typedef typename internal::Kernel_traits<TriangleMesh>::PPM PM_PPM; typedef typename internal::Kernel_traits<Triangle_mesh>::PPM PM_PPM;
const PM_PPM pm_ppmap = get(boost::vertex_point, mesh.mesh()); const PM_PPM pm_ppmap = get(boost::vertex_point, mesh.mesh());
// property map to go from vertex_descriptor to Point_3 // property map to go from vertex_descriptor to Point_3
@ -264,9 +264,9 @@ bool locate_unordered_cones(const SeamMesh& mesh,
CGAL_precondition(cones.empty()); CGAL_precondition(cones.empty());
CGAL_precondition(std::distance(first, beyond) == 3 || std::distance(first, beyond) == 4); CGAL_precondition(std::distance(first, beyond) == 3 || std::distance(first, beyond) == 4);
typedef typename SeamMesh::TriangleMesh TriangleMesh; typedef typename SeamMesh::Triangle_mesh Triangle_mesh;
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor TM_vertex_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::vertex_descriptor TM_vertex_descriptor;
typedef typename boost::graph_traits<SeamMesh>::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits<SeamMesh>::vertex_descriptor vertex_descriptor;
typedef typename boost::graph_traits<SeamMesh>::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits<SeamMesh>::halfedge_descriptor halfedge_descriptor;
@ -282,7 +282,7 @@ bool locate_unordered_cones(const SeamMesh& mesh,
CGAL_assertion(vertex_on_seam != vertex_descriptor()); CGAL_assertion(vertex_on_seam != vertex_descriptor());
// property map to go from TM_vertex_descriptor to Point_3 // property map to go from TM_vertex_descriptor to Point_3
typedef typename internal::Kernel_traits<TriangleMesh>::PPM PM_PPM; typedef typename internal::Kernel_traits<Triangle_mesh>::PPM PM_PPM;
const PM_PPM pm_ppmap = get(boost::vertex_point, mesh.mesh()); const PM_PPM pm_ppmap = get(boost::vertex_point, mesh.mesh());
// property map to go from vertex_descriptor to Point_3 // property map to go from vertex_descriptor to Point_3
@ -406,12 +406,15 @@ public:
#endif #endif
>::type Solver_traits; >::type Solver_traits;
#else #else
/// Solver traits type
typedef SolverTraits_ Solver_traits; typedef SolverTraits_ Solver_traits;
#endif #endif
/// Mesh halfedge type
typedef typename boost::graph_traits<SeamMesh>::halfedge_descriptor halfedge_descriptor;
private: private:
typedef typename boost::graph_traits<SeamMesh>::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits<SeamMesh>::vertex_descriptor vertex_descriptor;
typedef typename boost::graph_traits<SeamMesh>::halfedge_descriptor halfedge_descriptor;
typedef typename boost::graph_traits<SeamMesh>::face_descriptor face_descriptor; typedef typename boost::graph_traits<SeamMesh>::face_descriptor face_descriptor;
typedef typename boost::graph_traits<SeamMesh>::vertex_iterator vertex_iterator; typedef typename boost::graph_traits<SeamMesh>::vertex_iterator vertex_iterator;

View File

@ -67,18 +67,24 @@ class Square_border_parameterizer_3
{ {
// Public types // Public types
public: public:
/// Triangle mesh type
typedef TriangleMesh_ Triangle_mesh;
typedef TriangleMesh_ TriangleMesh; typedef TriangleMesh_ TriangleMesh;
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor; /// Mesh vertex type
typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::vertex_descriptor vertex_descriptor;
typedef Halfedge_around_face_iterator<TriangleMesh> halfedge_around_face_iterator; /// Mesh halfedge type
typedef typename boost::graph_traits<Triangle_mesh>::halfedge_descriptor halfedge_descriptor;
// Protected types // Protected types
protected: protected:
typedef Halfedge_around_face_iterator<Triangle_mesh> halfedge_around_face_iterator;
// Traits subtypes: // Traits subtypes:
typedef typename internal::Kernel_traits<TriangleMesh>::PPM PPM; typedef typename internal::Kernel_traits<Triangle_mesh>::PPM PPM;
typedef typename internal::Kernel_traits<TriangleMesh>::Kernel Kernel; typedef typename internal::Kernel_traits<Triangle_mesh>::Kernel Kernel;
typedef typename Kernel::FT NT; typedef typename Kernel::FT NT;
typedef typename Kernel::Point_2 Point_2; typedef typename Kernel::Point_2 Point_2;
typedef typename Kernel::Vector_3 Vector_3; typedef typename Kernel::Vector_3 Vector_3;
@ -92,14 +98,14 @@ private:
// Protected operations // Protected operations
protected: protected:
virtual double compute_edge_length(const TriangleMesh& mesh, virtual double compute_edge_length(const Triangle_mesh& mesh,
vertex_descriptor source, vertex_descriptor source,
vertex_descriptor target) const = 0; vertex_descriptor target) const = 0;
// Private operations // Private operations
private: private:
// Compute the total length of the border. // Compute the total length of the border.
double compute_border_length(const TriangleMesh& mesh, double compute_border_length(const Triangle_mesh& mesh,
halfedge_descriptor bhd) const halfedge_descriptor bhd) const
{ {
double len = 0.0; double len = 0.0;
@ -111,7 +117,7 @@ private:
// Utility method for parameterize(). // Utility method for parameterize().
// Compute the mesh iterator whose offset is closest to 'value'. // Compute the mesh iterator whose offset is closest to 'value'.
halfedge_around_face_iterator closest_iterator(const TriangleMesh& mesh, halfedge_around_face_iterator closest_iterator(const Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
Offset_map& offset, Offset_map& offset,
double value) const double value) const
@ -138,7 +144,7 @@ private:
// Set the corners by splitting the border of the mesh in four // Set the corners by splitting the border of the mesh in four
// approximately equal segments. // approximately equal segments.
template<typename VertexParameterizedMap> template<typename VertexParameterizedMap>
halfedge_descriptor compute_offsets_without_given_vertices(const TriangleMesh& mesh, halfedge_descriptor compute_offsets_without_given_vertices(const Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexParameterizedMap vpmap, VertexParameterizedMap vpmap,
Offset_map& offset) const Offset_map& offset) const
@ -185,7 +191,7 @@ private:
// the mesh. The vertices between two given vertices vi and vj are // the mesh. The vertices between two given vertices vi and vj are
// sent to the same side of the square. // sent to the same side of the square.
template<typename VertexParameterizedMap> template<typename VertexParameterizedMap>
halfedge_descriptor compute_offsets(const TriangleMesh& mesh, halfedge_descriptor compute_offsets(const Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexParameterizedMap vpmap, VertexParameterizedMap vpmap,
Offset_map& offset) Offset_map& offset)
@ -249,14 +255,14 @@ public:
/// (i.e.\ a (u,v) pair) on the border's shape. Mark them as <i>parameterized</i>. /// (i.e.\ a (u,v) pair) on the border's shape. Mark them as <i>parameterized</i>.
/// ///
/// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with /// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// %Point_2 (type deduced from `TriangleMesh` using `Kernel_traits`) /// %Point_2 (type deduced from `Triangle_mesh` using `Kernel_traits`)
/// as value type. /// as value type.
/// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with /// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// a unique integer as value type. /// a unique integer as value type.
/// \tparam VertexParameterizedMap must be a model of `ReadWritePropertyMap` with /// \tparam VertexParameterizedMap must be a model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// a Boolean as value type. /// a Boolean as value type.
/// ///
/// \param mesh a triangulated surface. /// \param mesh a triangulated surface.
@ -270,7 +276,7 @@ public:
template<typename VertexUVMap, template<typename VertexUVMap,
typename VertexIndexMap, typename VertexIndexMap,
typename VertexParameterizedMap> typename VertexParameterizedMap>
Error_code parameterize(const TriangleMesh& mesh, Error_code parameterize(const Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexUVMap uvmap, VertexUVMap uvmap,
VertexIndexMap /* vimap */, VertexIndexMap /* vimap */,
@ -396,10 +402,9 @@ class Square_border_uniform_parameterizer_3
// Public types // Public types
public: public:
// We have to repeat the types exported by superclass // We have to repeat the types exported by superclass
/// @cond SKIP_IN_MANUAL
typedef TriangleMesh_ TriangleMesh; typedef TriangleMesh_ TriangleMesh;
typedef TriangleMesh_ Triangle_mesh;
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor;
/// @endcond
// Private types // Private types
private: private:
@ -426,7 +431,7 @@ public:
// Protected operations // Protected operations
protected: protected:
/// computes the length of an edge. /// computes the length of an edge.
virtual NT compute_edge_length(const TriangleMesh& /* mesh */, virtual NT compute_edge_length(const Triangle_mesh& /* mesh */,
vertex_descriptor /* source */, vertex_descriptor /* source */,
vertex_descriptor /* target */) const vertex_descriptor /* target */) const
{ {
@ -462,14 +467,13 @@ class Square_border_arc_length_parameterizer_3
{ {
// Public types // Public types
public: public:
/// @cond SKIP_IN_MANUAL
typedef TriangleMesh_ TriangleMesh; typedef TriangleMesh_ TriangleMesh;
typedef TriangleMesh_ Triangle_mesh;
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor;
/// @endcond
// Private types // Private types
private: private:
typedef Square_border_parameterizer_3<TriangleMesh_> Base; typedef Square_border_parameterizer_3<Triangle_mesh> Base;
typedef typename Base::PPM PPM; typedef typename Base::PPM PPM;
typedef typename Base::NT NT; typedef typename Base::NT NT;
typedef typename Base::Vector_3 Vector_3; typedef typename Base::Vector_3 Vector_3;
@ -494,7 +498,7 @@ public:
// Protected operations // Protected operations
protected: protected:
/// Compute the length of an edge. /// Compute the length of an edge.
virtual NT compute_edge_length(const TriangleMesh& mesh, virtual NT compute_edge_length(const Triangle_mesh& mesh,
vertex_descriptor source, vertex_descriptor source,
vertex_descriptor target) const vertex_descriptor target) const
{ {

View File

@ -56,16 +56,20 @@ class Two_vertices_parameterizer_3
{ {
// Public types // Public types
public: public:
/// Triangle mesh type
typedef TriangleMesh_ TriangleMesh; typedef TriangleMesh_ TriangleMesh;
typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor; /// Mesh vertex type
typedef typename boost::graph_traits<TriangleMesh>::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits<Triangle_mesh>::vertex_descriptor vertex_descriptor;
/// Mesh halfedge type
typedef typename boost::graph_traits<Triangle_mesh>::halfedge_descriptor halfedge_descriptor;
// Private types // Private types
private: private:
// Traits subtypes: // Traits subtypes:
typedef typename internal::Kernel_traits<TriangleMesh>::PPM PPM; typedef typename internal::Kernel_traits<Triangle_mesh>::PPM PPM;
typedef typename internal::Kernel_traits<TriangleMesh>::Kernel Kernel; typedef typename internal::Kernel_traits<Triangle_mesh>::Kernel Kernel;
typedef typename Kernel::FT NT; typedef typename Kernel::FT NT;
typedef typename Kernel::Point_2 Point_2; typedef typename Kernel::Point_2 Point_2;
typedef typename Kernel::Point_3 Point_3; typedef typename Kernel::Point_3 Point_3;
@ -92,7 +96,7 @@ public:
typename VertexUVmap, typename VertexUVmap,
typename VertexIndexMap, typename VertexIndexMap,
typename VertexParameterizedMap> typename VertexParameterizedMap>
Error_code parameterize(const TriangleMesh& mesh, Error_code parameterize(const Triangle_mesh& mesh,
const VertexContainer& vertices, const VertexContainer& vertices,
VertexUVmap uvmap, VertexUVmap uvmap,
VertexIndexMap /* vimap */, VertexIndexMap /* vimap */,
@ -270,14 +274,14 @@ public:
/// maps two extreme vertices of the 3D mesh and mark them as <i>parameterized</i>. /// maps two extreme vertices of the 3D mesh and mark them as <i>parameterized</i>.
/// ///
/// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with /// \tparam VertexUVmap must be a model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// %Point_2 (type deduced from `TriangleMesh` using `Kernel_traits`) /// %Point_2 (type deduced from `Triangle_mesh` using `Kernel_traits`)
/// as value type. /// as value type.
/// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with /// \tparam VertexIndexMap must be a model of `ReadablePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// a unique integer as value type. /// a unique integer as value type.
/// \tparam VertexParameterizedMap must be a model of `ReadWritePropertyMap` with /// \tparam VertexParameterizedMap must be a model of `ReadWritePropertyMap` with
/// `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key type and /// `boost::graph_traits<Triangle_mesh>::%vertex_descriptor` as key type and
/// a Boolean as value type. /// a Boolean as value type.
/// ///
/// \param mesh a triangulated surface. /// \param mesh a triangulated surface.
@ -292,7 +296,7 @@ public:
template <typename VertexUVmap, template <typename VertexUVmap,
typename VertexIndexMap, typename VertexIndexMap,
typename VertexParameterizedMap> typename VertexParameterizedMap>
Error_code parameterize(const TriangleMesh& mesh, Error_code parameterize(const Triangle_mesh& mesh,
halfedge_descriptor bhd, halfedge_descriptor bhd,
VertexUVmap uvmap, VertexUVmap uvmap,
VertexIndexMap vimap, VertexIndexMap vimap,
@ -300,7 +304,7 @@ public:
{ {
// Fill containers // Fill containers
boost::unordered_set<vertex_descriptor> vertices; boost::unordered_set<vertex_descriptor> vertices;
internal::Containers_filler<TriangleMesh> fc(mesh, vertices); internal::Containers_filler<Triangle_mesh> fc(mesh, vertices);
Polygon_mesh_processing::connected_component( Polygon_mesh_processing::connected_component(
face(opposite(bhd, mesh), mesh), face(opposite(bhd, mesh), mesh),
mesh, mesh,