make connecteced_component work for Seam_mesh

This commit is contained in:
Andreas Fabri 2015-12-03 17:59:29 +01:00 committed by Mael Rouxel-Labbé
parent c3e884373a
commit 99a3b99283
5 changed files with 76 additions and 28 deletions

View File

@ -200,6 +200,16 @@ typedef typename boost::graph_traits<TM>::face_descriptor face_descriptor;
} }
}; };
struct edge_descriptor {
halfedge_descriptor hd;
edge_descriptor(const halfedge_descriptor& hd)
: hd(hd)
{}
};
const TM& tm; const TM& tm;
std::set<TM_edge_descriptor> seam_edges; std::set<TM_edge_descriptor> seam_edges;
std::set<TM_vertex_descriptor> seam_vertices; std::set<TM_vertex_descriptor> seam_vertices;

View File

@ -53,11 +53,12 @@ private:
public: public:
// Graph // Graph
typedef typename SM::vertex_descriptor vertex_descriptor; typedef typename SM::vertex_descriptor vertex_descriptor;
typedef typename SM::face_descriptor face_descriptor;
/* /*
typedef typename SM::Point vertex_property_type; typedef typename SM::Point vertex_property_type;
typedef typename SM::Edge_index edge_descriptor;
*/ */
typedef typename SM::edge_descriptor edge_descriptor;
typedef boost::undirected_tag directed_category; typedef boost::undirected_tag directed_category;
typedef boost::disallow_parallel_edge_tag edge_parallel_category; typedef boost::disallow_parallel_edge_tag edge_parallel_category;
typedef SM_graph_traversal_category traversal_category; typedef SM_graph_traversal_category traversal_category;
@ -66,7 +67,7 @@ public:
typedef typename SM::halfedge_descriptor halfedge_descriptor; typedef typename SM::halfedge_descriptor halfedge_descriptor;
// FaceGraph // FaceGraph
//typedef typename SM::face_index face_descriptor; typedef typename SM::face_descriptor face_descriptor;
// VertexListGraph // VertexListGraph
typedef typename SM::vertex_iterator vertex_iterator; typedef typename SM::vertex_iterator vertex_iterator;
@ -92,9 +93,9 @@ public:
//typedef CGAL::Out_edge_iterator<SM> out_edge_iterator; //typedef CGAL::Out_edge_iterator<SM> out_edge_iterator;
// nulls // nulls
//static vertex_descriptor null_vertex() { return vertex_descriptor(); } static vertex_descriptor null_vertex() { return vertex_descriptor(); }
//static face_descriptor null_face() { return face_descriptor(); } static face_descriptor null_face() { return face_descriptor(); }
//static halfedge_descriptor null_halfedge() { return halfedge_descriptor(); } static halfedge_descriptor null_halfedge() { return halfedge_descriptor(); }
}; };
template<typename P> template<typename P>
@ -269,13 +270,13 @@ opposite(typename boost::graph_traits<CGAL::Seam_mesh<P> >::halfedge_descriptor
return sm.m_opposite(h); return sm.m_opposite(h);
} }
#if 0
template <typename P> template <typename P>
typename boost::graph_traits<CGAL::Seam_mesh<P> >::edge_descriptor typename boost::graph_traits<CGAL::Seam_mesh<P> >::edge_descriptor
edge(typename boost::graph_traits<CGAL::Seam_mesh<P> >::halfedge_descriptor h, edge(typename boost::graph_traits<CGAL::Seam_mesh<P> >::halfedge_descriptor h,
const CGAL::Seam_mesh<P>& sm) const CGAL::Seam_mesh<P>& sm)
{ {
return sm.m_edge(h); return h;
} }
template <typename P> template <typename P>
@ -283,10 +284,10 @@ typename boost::graph_traits<CGAL::Seam_mesh<P> >::halfedge_descriptor
halfedge(typename boost::graph_traits<CGAL::Seam_mesh<P> >::edge_descriptor e, halfedge(typename boost::graph_traits<CGAL::Seam_mesh<P> >::edge_descriptor e,
const CGAL::Seam_mesh<P>& sm) const CGAL::Seam_mesh<P>& sm)
{ {
return sm.m_halfedge(e); return e.hd;
} }
#endif
template <typename P> template <typename P>
typename boost::graph_traits<CGAL::Seam_mesh<P> >::halfedge_descriptor typename boost::graph_traits<CGAL::Seam_mesh<P> >::halfedge_descriptor
@ -348,16 +349,17 @@ halfedge(typename boost::graph_traits<CGAL::Seam_mesh<P> >::face_descriptor f,
return halfedge(f, sm.mesh()); return halfedge(f, sm.mesh());
} }
#if 0
template<typename P> template<typename P>
typename boost::graph_traits<CGAL::Seam_mesh<P> >::face_descriptor typename boost::graph_traits<CGAL::Seam_mesh<P> >::face_descriptor
face(typename boost::graph_traits<CGAL::Seam_mesh<P> >::halfedge_descriptor h, face(typename boost::graph_traits<CGAL::Seam_mesh<P> >::halfedge_descriptor h,
const CGAL::Seam_mesh<P>& sm) const CGAL::Seam_mesh<P>& sm)
{ {
return sm.face(h); if(h.seam){
return boost::graph_traits<CGAL::Seam_mesh<P> >::null_face();
}
return face(h, sm.mesh());
} }
#endif
// //

View File

@ -98,8 +98,17 @@ int main(int argc, char * argv[])
Mesh mesh(sm, seam, smhd,vipm); Mesh mesh(sm, seam, smhd,vipm);
halfedge_descriptor bhd(smhd); halfedge_descriptor bhd(smhd);
bhd = opposite(bhd,mesh); // a halfedge on the virtual hole
#if 0
std::vector<face_descriptor> faces;
CGAL::Polygon_mesh_processing::connected_component(face(bhd,mesh),
mesh,
std::back_inserter(faces));
std::cerr << faces.size() << std::endl;
return 0;
#endif
bhd = opposite(bhd,mesh); // a halfedge on the virtual hole
Parameterizer::Error_code err = CGAL::parameterize(mesh, Parameterizer(), bhd, uvpm, vipm, vpapm); Parameterizer::Error_code err = CGAL::parameterize(mesh, Parameterizer(), bhd, uvpm, vipm, vpapm);
@ -119,7 +128,7 @@ int main(int argc, char * argv[])
break; break;
}; };
#if 0
BOOST_FOREACH(face_descriptor fd, faces(mesh)){ BOOST_FOREACH(face_descriptor fd, faces(mesh)){
halfedge_descriptor hd = halfedge(fd,mesh); halfedge_descriptor hd = halfedge(fd,mesh);
std::cout << "4 " << uvm[target(hd,mesh)].x() << " " << uvm[target(hd,mesh)].y() << " 0 "; std::cout << "4 " << uvm[target(hd,mesh)].x() << " " << uvm[target(hd,mesh)].y() << " 0 ";
@ -129,6 +138,6 @@ int main(int argc, char * argv[])
} }
std::cout << std::endl; std::cout << std::endl;
} }
#endif
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@ -409,12 +409,6 @@ parameterize(TriangleMesh& mesh, halfedge_descriptor bhd, VertexUVmap uvmap, Ver
int index = get(vimap,v); int index = get(vimap,v);
put(uvmap,v,Point_2(Xu[index],Xv[index])); put(uvmap,v,Point_2(Xu[index],Xv[index]));
put(vpm,v,true); put(vpm,v,true);
/*
BOOST_FOREACH(halfedge_descriptor hd, halfedges_around_target(v,mesh)){
int index = get(vimap,hd);
put(uvmap,hd,Point_2(Xu[index],Xv[index]));
}
*/
} }
} }
#ifdef DEBUG_TRACE #ifdef DEBUG_TRACE

View File

@ -25,6 +25,9 @@
#include <CGAL/Mean_value_coordinates_parameterizer_3.h> #include <CGAL/Mean_value_coordinates_parameterizer_3.h>
#include <CGAL/Polygon_mesh_processing/connected_components.h>
#include <boost/function_output_iterator.hpp>
#include <boost/property_map/property_map.hpp>
/// \file parameterize.h /// \file parameterize.h
@ -52,6 +55,31 @@ parameterize(ParameterizationMesh_3& mesh) ///< 3D mesh, model of Parameterizat
} }
namespace Parameterization {
template <typename Mesh, typename Map>
struct Vertices {
Vertices(const Mesh& mesh, Map& map)
: mesh(mesh), map(&map), index(0)
{}
void operator()(const typename boost::graph_traits<Mesh>::face_descriptor& fd)
{
BOOST_FOREACH(typename boost::graph_traits<Mesh>::vertex_descriptor vd, vertices_around_face(halfedge(fd,mesh),mesh)){
if(map->find(vd) == map->end()){
(*map)[vd] = index++;
}
}
}
const Mesh& mesh;
mutable Map* map;
int index;
};
}
/// \ingroup PkgSurfaceParameterizationMainFunction /// \ingroup PkgSurfaceParameterizationMainFunction
/// ///
/// Compute a one-to-one mapping from a 3D triangle surface `mesh` to a /// Compute a one-to-one mapping from a 3D triangle surface `mesh` to a
@ -66,7 +94,7 @@ parameterize(ParameterizationMesh_3& mesh) ///< 3D mesh, model of Parameterizat
/// \pre `mesh` must be a triangular mesh. /// \pre `mesh` must be a triangular mesh.
/// \pre The mesh border must be mapped onto a convex polygon /// \pre The mesh border must be mapped onto a convex polygon
/// (for fixed border parameterizations). /// (for fixed border parameterizations).
///
template <class TriangleMesh, class Parameterizer, class HD, class VertexUVmap, typename VertexIndexMap, typename VertexParameterizedMap> template <class TriangleMesh, class Parameterizer, class HD, class VertexUVmap, typename VertexIndexMap, typename VertexParameterizedMap>
typename Parameterizer_traits_3<TriangleMesh>::Error_code typename Parameterizer_traits_3<TriangleMesh>::Error_code
parameterize(TriangleMesh& mesh, parameterize(TriangleMesh& mesh,
@ -76,7 +104,13 @@ parameterize(TriangleMesh& mesh,
VertexIndexMap vimap, VertexIndexMap vimap,
VertexParameterizedMap vpm) VertexParameterizedMap vpm)
{ {
return parameterizer.parameterize(mesh, bhd, uvm, vimap, vpm); typedef typename boost::graph_traits<TriangleMesh>::vertex_descriptor vertex_descriptor;
typedef std::map<vertex_descriptor,int> Indices;
Indices indices;
CGAL::Polygon_mesh_processing::connected_component(face(opposite(bhd,mesh),mesh),
mesh,
boost::make_function_output_iterator(Parameterization::Vertices<TriangleMesh,Indices>(mesh,indices)));
return parameterizer.parameterize(mesh, bhd, uvm, boost::make_assoc_property_map(indices), vpm);
} }
@ -93,7 +127,6 @@ parameterize(Seam_mesh<TriangleMesh>& mesh,
VertexIndexMap vimap, VertexIndexMap vimap,
VertexParameterizedMap vpm) VertexParameterizedMap vpm)
{ {
std::cerr << "treat Seam_mesh"<< std::endl;
Seam_mesh_uv_map<TriangleMesh,VertexUVmap> putter(mesh,uvm); Seam_mesh_uv_map<TriangleMesh,VertexUVmap> putter(mesh,uvm);
return parameterizer.parameterize(mesh, bhd, putter, vimap, vpm); return parameterizer.parameterize(mesh, bhd, putter, vimap, vpm);
} }