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;
std::set<TM_edge_descriptor> seam_edges;
std::set<TM_vertex_descriptor> seam_vertices;

View File

@ -52,21 +52,22 @@ private:
public:
// Graph
typedef typename SM::vertex_descriptor vertex_descriptor;
typedef typename SM::face_descriptor face_descriptor;
typedef typename SM::vertex_descriptor vertex_descriptor;
/*
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::disallow_parallel_edge_tag edge_parallel_category;
typedef SM_graph_traversal_category traversal_category;
// HalfedgeGraph
typedef typename SM::halfedge_descriptor halfedge_descriptor;
typedef typename SM::halfedge_descriptor halfedge_descriptor;
// FaceGraph
//typedef typename SM::face_index face_descriptor;
typedef typename SM::face_descriptor face_descriptor;
// VertexListGraph
typedef typename SM::vertex_iterator vertex_iterator;
@ -92,9 +93,9 @@ public:
//typedef CGAL::Out_edge_iterator<SM> out_edge_iterator;
// nulls
//static vertex_descriptor null_vertex() { return vertex_descriptor(); }
//static face_descriptor null_face() { return face_descriptor(); }
//static halfedge_descriptor null_halfedge() { return halfedge_descriptor(); }
static vertex_descriptor null_vertex() { return vertex_descriptor(); }
static face_descriptor null_face() { return face_descriptor(); }
static halfedge_descriptor null_halfedge() { return halfedge_descriptor(); }
};
template<typename P>
@ -269,13 +270,13 @@ opposite(typename boost::graph_traits<CGAL::Seam_mesh<P> >::halfedge_descriptor
return sm.m_opposite(h);
}
#if 0
template <typename P>
typename boost::graph_traits<CGAL::Seam_mesh<P> >::edge_descriptor
edge(typename boost::graph_traits<CGAL::Seam_mesh<P> >::halfedge_descriptor h,
const CGAL::Seam_mesh<P>& sm)
{
return sm.m_edge(h);
return h;
}
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,
const CGAL::Seam_mesh<P>& sm)
{
return sm.m_halfedge(e);
return e.hd;
}
#endif
template <typename P>
typename boost::graph_traits<CGAL::Seam_mesh<P> >::halfedge_descriptor
@ -348,17 +349,18 @@ halfedge(typename boost::graph_traits<CGAL::Seam_mesh<P> >::face_descriptor f,
return halfedge(f, sm.mesh());
}
#if 0
template<typename P>
typename boost::graph_traits<CGAL::Seam_mesh<P> >::face_descriptor
face(typename boost::graph_traits<CGAL::Seam_mesh<P> >::halfedge_descriptor h,
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
//
// FaceListGraph

View File

@ -98,8 +98,17 @@ int main(int argc, char * argv[])
Mesh mesh(sm, seam, smhd,vipm);
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);
@ -119,7 +128,7 @@ int main(int argc, char * argv[])
break;
};
#if 0
BOOST_FOREACH(face_descriptor fd, faces(mesh)){
halfedge_descriptor hd = halfedge(fd,mesh);
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;
}
#endif
return EXIT_SUCCESS;
}

View File

@ -409,12 +409,6 @@ parameterize(TriangleMesh& mesh, halfedge_descriptor bhd, VertexUVmap uvmap, Ver
int index = get(vimap,v);
put(uvmap,v,Point_2(Xu[index],Xv[index]));
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

View File

@ -25,6 +25,9 @@
#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
@ -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
///
/// 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 The mesh border must be mapped onto a convex polygon
/// (for fixed border parameterizations).
///
template <class TriangleMesh, class Parameterizer, class HD, class VertexUVmap, typename VertexIndexMap, typename VertexParameterizedMap>
typename Parameterizer_traits_3<TriangleMesh>::Error_code
parameterize(TriangleMesh& mesh,
@ -76,7 +104,13 @@ parameterize(TriangleMesh& mesh,
VertexIndexMap vimap,
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,
VertexParameterizedMap vpm)
{
std::cerr << "treat Seam_mesh"<< std::endl;
Seam_mesh_uv_map<TriangleMesh,VertexUVmap> putter(mesh,uvm);
return parameterizer.parameterize(mesh, bhd, putter, vimap, vpm);
}