mirror of https://github.com/CGAL/cgal
Fix documentation of Surface_mesh_parameterization
Too many classes/functions/typedefs/etc. showing, extract_all to blame?
This commit is contained in:
parent
aa2bdbdb5e
commit
93a70d32b9
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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 \
|
||||||
|
|
|
||||||
|
|
@ -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>`
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue