it now works with Surface_mesh

This commit is contained in:
Andreas Fabri 2015-03-11 19:05:57 +01:00
parent 0321056aff
commit 2d7f51f441
5 changed files with 48 additions and 27 deletions

View File

@ -41,6 +41,7 @@ if ( CGAL_FOUND )
endif()
create_single_source_cgal_program( Compute_Ridges_Umbilics.cpp)
create_single_source_cgal_program( Ridges_Umbilics_SM.cpp)
else(EIGEN3_FOUND OR LAPACK_FOUND)

View File

@ -44,13 +44,17 @@ void compute_facets_normals(const TriangleMesh& tm,
FaceVectorMap fvm,
const Kernel& k)
{
typedef boost::property_traits<FaceVectorMap>::value_type Vector_3;
typedef boost::property_map<TriangleMesh,CGAL::vertex_point_t>::type VPM;
VPM vpm = get(CGAL::vertex_point,tm);
BOOST_FOREACH(typename boost::graph_traits<TriangleMesh>::face_descriptor f, faces(tm)){
typename boost::graph_traits<TriangleMesh>::halfedge_descriptor h = halfedge(f,tm);
typename Kernel::Vector_3 normal =
CGAL::cross_product(target(h,tm)->point() -
target(opposite(h,tm),tm)->point(),
target(next(h,tm),tm)->point() -
target(opposite(h,tm),tm)->point());
Vector_3 normal =
CGAL::cross_product(get(vpm, target(h,tm)) -
get(vpm, target(opposite(h,tm),tm)),
get(vpm, target(CGAL::next(h,tm),tm)) - // AF: arghh CGAL::
get(vpm, target(opposite(h,tm),tm)));
put(fvm, f, normal / CGAL::sqrt(normal * normal));
}
}

View File

@ -32,11 +32,15 @@ namespace CGAL {
//triangle incident to the halfedge.
//---------------------------------------------------------------------------
template < class TriangularPolyhedralSurface > class T_Gate
{
{
typedef typename boost::property_map<TriangularPolyhedralSurface,CGAL::vertex_point_t>::type VPM;
typedef typename boost::property_traits<VPM>::value_type Point_3;
typedef typename Kernel_traits<Point_3>::Kernel Kernel;
public:
typedef typename TriangularPolyhedralSurface::Traits::FT FT;
typedef typename TriangularPolyhedralSurface::Traits::Vector_3 Vector_3;
typedef typename TriangularPolyhedralSurface::Traits::Point_3 Point_3;
typedef typename Kernel::FT FT;
typedef typename Kernel::Vector_3 Vector_3;
typedef typename boost::graph_traits<TriangularPolyhedralSurface>::vertex_descriptor Vertex_const_handle;
typedef typename boost::graph_traits<TriangularPolyhedralSurface>::halfedge_descriptor Halfedge_const_handle;
@ -79,11 +83,15 @@ struct compare_gates
template < class TriangularPolyhedralSurface >
class T_PolyhedralSurf_neighbors
{
const TriangularPolyhedralSurface& P;
typedef typename boost::property_map<TriangularPolyhedralSurface,CGAL::vertex_point_t>::type VPM;
typedef typename boost::property_traits<VPM>::value_type Point_3;
typedef typename Kernel_traits<Point_3>::Kernel Kernel;
public:
typedef typename TriangularPolyhedralSurface::Traits::FT FT;
typedef typename TriangularPolyhedralSurface::Traits::Vector_3 Vector_3;
typedef typename TriangularPolyhedralSurface::Traits::Point_3 Point_3;
typedef typename Kernel::FT FT;
typedef typename Kernel::Vector_3 Vector_3;
typedef typename boost::graph_traits<TriangularPolyhedralSurface>::vertex_descriptor Vertex_const_handle;
typedef typename boost::graph_traits<TriangularPolyhedralSurface>::halfedge_descriptor Halfedge_const_handle;
typedef CGAL::Halfedge_around_target_circulator<TriangularPolyhedralSurface>
@ -116,10 +124,10 @@ public:
Gate make_gate(const Vertex_const_handle v,
const Halfedge_const_handle he)
{
Point_3 p0 = v->point(),
p1 = target(he,P)->point(),
p2 = target(next(he,P),P)->point(),
p3 = target(prev(he,P),P)->point();
Point_3 p0 = get(vpm, v),
p1 = get(vpm, target(he,P)),
p2 = get(vpm, target(next(he,P),P)),
p3 = get(vpm, target(prev(he,P),P));
Vector_3 p0p1 = p0 - p1,
p0p2 = p0 - p2,
p0p3 = p0 - p3;
@ -131,13 +139,17 @@ public:
}
protected:
/*
//tag to visit vertices
struct Vertex_cmp{//comparison is wrt vertex addresses
bool operator()(const Vertex_const_handle a, const Vertex_const_handle b) const{
return &*a < &*b;
}
};
typedef std::map<Vertex_const_handle, bool, Vertex_cmp> Vertex2bool_map;
*/
const TriangularPolyhedralSurface& P;
VPM vpm;
typedef std::map<Vertex_const_handle, bool/*, Vertex_cmp*/> Vertex2bool_map;
Vertex2bool_map is_visited_map;
};
@ -145,7 +157,7 @@ public:
template < class TriangularPolyhedralSurface >
T_PolyhedralSurf_neighbors < TriangularPolyhedralSurface >::
T_PolyhedralSurf_neighbors(const TriangularPolyhedralSurface& P)
:P(P)
:P(P), vpm(get(vertex_point,P))
{
//init the is_visited_map
Vertex_const_iterator itb, ite;
@ -178,12 +190,12 @@ compute_one_ring(const Vertex_const_handle v,
ite = vertex_neigh.end();
itb++;//the first vertex v is the center to which distances are
//computed from, for other 1ring neighbors
Point_3 p0 = v->point(), p;
Point_3 p0 = get(vpm, v), p;
Vector_3 p0p;
FT d = OneRingSize;
for (; itb != ite; itb++){
p = (*itb)->point();
p = get(vpm, *itb);
p0p = p0 - p;
d = CGAL::sqrt(p0p*p0p);
if (d > OneRingSize) OneRingSize = d;
@ -249,7 +261,7 @@ compute_neighbors(const Vertex_const_handle v,
if ( iter != contour.begin() ) pos_prev = --iter;
else pos_prev = --contour.end();
if ( he->next() == *pos_next )
if ( next(he,P) == *pos_next )
{ // case 2a
//contour
he1 = opposite(prev(he,P),P);

View File

@ -57,8 +57,12 @@ enum Ridge_order {Ridge_order_3 = 3, Ridge_order_4 = 4};
//--------------------------------------------------------------------------
template < class TriangulatedSurfaceMesh > class Ridge_line
{
typedef typename boost::property_map<TriangulatedSurfaceMesh,CGAL::vertex_point_t>::type VPM;
typedef typename boost::property_traits<VPM>::value_type Point_3;
typedef typename Kernel_traits<Point_3>::Kernel Kernel;
public:
typedef typename TriangulatedSurfaceMesh::Traits::FT FT;
typedef typename Kernel::FT FT;
typedef typename boost::graph_traits<TriangulatedSurfaceMesh>::halfedge_descriptor halfedge_descriptor;
typedef std::pair< halfedge_descriptor, FT> ridge_halfhedge;
@ -377,8 +381,8 @@ template < class TriangulatedSurfaceMesh,
BOOST_FOREACH(vertex_descriptor v, vertices(p)){
points.push_back(get(vpm,v));
}
CGAL::Min_sphere_d<CGAL::Optimisation_d_traits_3<typename TriangulatedSurfaceMesh::Traits> >
CGAL::Min_sphere_d<CGAL::Optimisation_d_traits_3<Kernel> >
min_sphere(points.begin(), points.end());
squared_model_size = min_sphere.squared_radius();
//maybe better to use CGAL::Min_sphere_of_spheres_d ?? but need to create spheres?
@ -461,7 +465,7 @@ template < class TriangulatedSurfaceMesh,
//follow the ridge from curhe
if (is_visited_map.find(f)->second) break;
is_visited_map.find(f)->second = true;
if (curhe->opposite() == curhe1) curhe = curhe2;
if (opposite(curhe,P) == curhe1) curhe = curhe2;
else curhe = curhe1;//curhe stays at the ridge extremity
addfront(cur_ridge_line, curhe, cur_ridge_type);
if ( ! is_border_edge(curhe,P) ) f = face(opposite(curhe,P),P);

View File

@ -41,7 +41,7 @@ class Umbilic
public:
typedef typename boost::graph_traits<TriangulatedSurfaceMesh>::vertex_descriptor Vertex_const_handle;
typedef typename boost::graph_traits<TriangulatedSurfaceMesh>::halfedge_descriptor Halfedge_const_handle;
typedef typename TriangulatedSurfaceMesh::Traits::Vector_3 Vector_3;
// typedef typename TriangulatedSurfaceMesh::Traits::Vector_3 Vector_3;
//contructor
Umbilic(const Vertex_const_handle v_init,