rename ECM -> TM in code

This commit is contained in:
Sébastien Loriot 2018-01-16 09:53:29 +01:00
parent c6839a6aea
commit f2b1e70d80
18 changed files with 232 additions and 232 deletions

View File

@ -86,9 +86,9 @@ bool handle_exists ( Iterator begin, Iterator end, Handle h )
return false ; return false ;
} }
template <class ECM> template <class TM>
struct No_constrained_edge_map{ struct No_constrained_edge_map{
typedef typename boost::graph_traits<ECM>::edge_descriptor key_type; typedef typename boost::graph_traits<TM>::edge_descriptor key_type;
typedef bool value_type; typedef bool value_type;
typedef value_type reference; typedef value_type reference;
typedef boost::readable_property_map_tag category; typedef boost::readable_property_map_tag category;
@ -130,44 +130,44 @@ inline std::string optional_to_string( boost::optional<T> const& o )
#if defined(CGAL_SURFACE_SIMPLIFICATION_ENABLE_TRACE) \ #if defined(CGAL_SURFACE_SIMPLIFICATION_ENABLE_TRACE) \
|| defined(CGAL_SURFACE_SIMPLIFICATION_ENABLE_LT_TRACE) || defined(CGAL_SURFACE_SIMPLIFICATION_ENABLE_LT_TRACE)
#define CGAL_ECMS_ENABLE_TRACE #define CGAL_SMS_ENABLE_TRACE
#endif #endif
#ifdef CGAL_ECMS_ENABLE_TRACE #ifdef CGAL_SMS_ENABLE_TRACE
# include<string> # include<string>
# include<iostream> # include<iostream>
# include<sstream> # include<sstream>
namespace internal { namespace { bool cgal_enable_ecms_trace = true ; } } namespace internal { namespace { bool cgal_enable_sms_trace = true ; } }
# define CGAL_ECMS_TRACE_IMPL(m) \ # define CGAL_SMS_TRACE_IMPL(m) \
if ( ::internal::cgal_enable_ecms_trace ) { \ if ( ::internal::cgal_enable_sms_trace ) { \
std::ostringstream ss ; ss << m ; std::string s = ss.str(); \ std::ostringstream ss ; ss << m ; std::string s = ss.str(); \
/*Surface_simplification_external_trace(s)*/ std::cerr << s << std::endl; \ /*Surface_simplification_external_trace(s)*/ std::cerr << s << std::endl; \
} }
# define CGAL_ECMS_DEBUG_CODE(code) code # define CGAL_SMS_DEBUG_CODE(code) code
#else #else
# define CGAL_ECMS_DEBUG_CODE(code) # define CGAL_SMS_DEBUG_CODE(code)
#endif #endif
#ifdef CGAL_SURFACE_SIMPLIFICATION_ENABLE_LT_TRACE #ifdef CGAL_SURFACE_SIMPLIFICATION_ENABLE_LT_TRACE
# define CGAL_ECMS_LT_TRACE(l,m) if ( (l) <= CGAL_SURFACE_SIMPLIFICATION_ENABLE_LT_TRACE ) CGAL_ECMS_TRACE_IMPL(m) # define CGAL_SMS_LT_TRACE(l,m) if ( (l) <= CGAL_SURFACE_SIMPLIFICATION_ENABLE_LT_TRACE ) CGAL_SMS_TRACE_IMPL(m)
#else #else
# define CGAL_ECMS_LT_TRACE(l,m) # define CGAL_SMS_LT_TRACE(l,m)
#endif #endif
#ifdef CGAL_SURFACE_SIMPLIFICATION_ENABLE_TRACE #ifdef CGAL_SURFACE_SIMPLIFICATION_ENABLE_TRACE
# define CGAL_ECMS_TRACE_IF(c,l,m) if ( (c) && ( (l) <= CGAL_SURFACE_SIMPLIFICATION_ENABLE_TRACE) ) CGAL_ECMS_TRACE_IMPL(m) # define CGAL_SMS_TRACE_IF(c,l,m) if ( (c) && ( (l) <= CGAL_SURFACE_SIMPLIFICATION_ENABLE_TRACE) ) CGAL_SMS_TRACE_IMPL(m)
# define CGAL_ECMS_TRACE(l,m) if ( (l) <= CGAL_SURFACE_SIMPLIFICATION_ENABLE_TRACE ) CGAL_ECMS_TRACE_IMPL(m) # define CGAL_SMS_TRACE(l,m) if ( (l) <= CGAL_SURFACE_SIMPLIFICATION_ENABLE_TRACE ) CGAL_SMS_TRACE_IMPL(m)
#else #else
# define CGAL_ECMS_TRACE_IF(c,l,m) # define CGAL_SMS_TRACE_IF(c,l,m)
# define CGAL_ECMS_TRACE(l,m) # define CGAL_SMS_TRACE(l,m)
#endif #endif
#undef CGAL_ECMS_ENABLE_TRACE #undef CGAL_SMS_ENABLE_TRACE
#ifdef CGAL_TESTING_SURFACE_MESH_SIMPLIFICATION #ifdef CGAL_TESTING_SURFACE_MESH_SIMPLIFICATION
# define CGAL_SURF_SIMPL_TEST_assertion(EX) CGAL_assertion(EX) # define CGAL_SURF_SIMPL_TEST_assertion(EX) CGAL_assertion(EX)

View File

@ -35,7 +35,7 @@ namespace Surface_mesh_simplification
// //
// Implementation of the vertex-pair collapse triangulated surface mesh simplification algorithm // Implementation of the vertex-pair collapse triangulated surface mesh simplification algorithm
// //
template<class ECM_ template<class TM_
,class ShouldStop_ ,class ShouldStop_
,class VertexIndexMap_ ,class VertexIndexMap_
,class VertexPointMap_ ,class VertexPointMap_
@ -49,7 +49,7 @@ class EdgeCollapse
{ {
public: public:
typedef ECM_ ECM ; typedef TM_ TM ;
typedef ShouldStop_ ShouldStop ; typedef ShouldStop_ ShouldStop ;
typedef VertexIndexMap_ VertexIndexMap ; typedef VertexIndexMap_ VertexIndexMap ;
typedef VertexPointMap_ VertexPointMap ; typedef VertexPointMap_ VertexPointMap ;
@ -61,17 +61,17 @@ public:
typedef EdgeCollapse Self ; typedef EdgeCollapse Self ;
typedef Edge_profile<ECM,VertexPointMap> Profile ; typedef Edge_profile<TM,VertexPointMap> Profile ;
typedef boost::graph_traits <ECM> GraphTraits ; typedef boost::graph_traits <TM> GraphTraits ;
typedef boost::graph_traits <ECM const> ConstGraphTraits ; typedef boost::graph_traits <TM const> ConstGraphTraits ;
typedef typename GraphTraits::vertex_descriptor vertex_descriptor ; typedef typename GraphTraits::vertex_descriptor vertex_descriptor ;
typedef typename GraphTraits::vertex_iterator vertex_iterator ; typedef typename GraphTraits::vertex_iterator vertex_iterator ;
typedef typename GraphTraits::halfedge_descriptor halfedge_descriptor ; typedef typename GraphTraits::halfedge_descriptor halfedge_descriptor ;
typedef typename GraphTraits::halfedge_iterator halfedge_iterator ; typedef typename GraphTraits::halfedge_iterator halfedge_iterator ;
typedef CGAL::Halfedge_around_source_iterator<ECM> out_edge_iterator ; typedef CGAL::Halfedge_around_source_iterator<TM> out_edge_iterator ;
typedef CGAL::Halfedge_around_target_iterator<ECM> in_edge_iterator ; typedef CGAL::Halfedge_around_target_iterator<TM> in_edge_iterator ;
typedef typename GraphTraits::traversal_category traversal_category ; typedef typename GraphTraits::traversal_category traversal_category ;
typedef typename GraphTraits::edges_size_type size_type ; typedef typename GraphTraits::edges_size_type size_type ;
@ -170,7 +170,7 @@ public:
public: public:
EdgeCollapse( ECM& aSurface EdgeCollapse( TM& aSurface
, ShouldStop const& aShouldStop , ShouldStop const& aShouldStop
, VertexIndexMap const& aVertex_index_map , VertexIndexMap const& aVertex_index_map
, VertexPointMap const& aVertex_point_map , VertexPointMap const& aVertex_point_map
@ -209,7 +209,7 @@ private:
return is_primary_edge(aEdge) ? aEdge : opposite(aEdge,mSurface) ; return is_primary_edge(aEdge) ? aEdge : opposite(aEdge,mSurface) ;
} }
bool is_border ( halfedge_descriptor const& aEdge ) const { return face(aEdge,mSurface) == boost::graph_traits<ECM>::null_face() ; } bool is_border ( halfedge_descriptor const& aEdge ) const { return face(aEdge,mSurface) == boost::graph_traits<TM>::null_face() ; }
bool is_constrained( halfedge_descriptor const& aEdge ) const { return get(Edge_is_constrained_map,edge(aEdge,mSurface)); } bool is_constrained( halfedge_descriptor const& aEdge ) const { return get(Edge_is_constrained_map,edge(aEdge,mSurface)); }
bool is_constrained( vertex_descriptor const& aVertex ) const; bool is_constrained( vertex_descriptor const& aVertex ) const;
@ -343,10 +343,10 @@ private:
} }
template<class ECM> template<class TM>
vertex_descriptor vertex_descriptor
halfedge_collapse_bk_compatibility( halfedge_collapse_bk_compatibility(
halfedge_descriptor const& pq, No_constrained_edge_map<ECM> ) halfedge_descriptor const& pq, No_constrained_edge_map<TM> )
{ {
vertex_descriptor vd = CGAL::Euler::collapse_edge(edge(pq,mSurface), mSurface); vertex_descriptor vd = CGAL::Euler::collapse_edge(edge(pq,mSurface), mSurface);
return vd; return vd;
@ -362,10 +362,10 @@ private:
return is_constrained(aProfile.v0()) && is_constrained(aProfile.v1()); return is_constrained(aProfile.v0()) && is_constrained(aProfile.v1());
} }
template<class ECM> template<class TM>
bool bool
is_edge_adjacent_to_a_constrained_edge( is_edge_adjacent_to_a_constrained_edge(
halfedge_descriptor const&, No_constrained_edge_map<ECM> ) halfedge_descriptor const&, No_constrained_edge_map<TM> )
{ {
return false; return false;
} }
@ -373,7 +373,7 @@ private:
private: private:
ECM& mSurface ; TM& mSurface ;
ShouldStop const& Should_stop ; ShouldStop const& Should_stop ;
VertexIndexMap const& Vertex_index_map ; VertexIndexMap const& Vertex_index_map ;
@ -396,7 +396,7 @@ private:
FT mcMaxDihedralAngleCos2 ; FT mcMaxDihedralAngleCos2 ;
CGAL_ECMS_DEBUG_CODE ( unsigned mStep ; ) CGAL_SMS_DEBUG_CODE ( unsigned mStep ; )
} ; } ;
} // namespace Surface_mesh_simplification } // namespace Surface_mesh_simplification

View File

@ -29,7 +29,7 @@ namespace Surface_mesh_simplification
{ {
template<class M, class SP, class VIM, class VPM,class EIM, class ECTM, class CF, class PF, class V> template<class M, class SP, class VIM, class VPM,class EIM, class ECTM, class CF, class PF, class V>
EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::EdgeCollapse( ECM& aSurface EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::EdgeCollapse( TM& aSurface
, ShouldStop const& aShould_stop , ShouldStop const& aShould_stop
, VertexIndexMap const& aVertex_index_map , VertexIndexMap const& aVertex_index_map
, VertexPointMap const& aVertex_point_map , VertexPointMap const& aVertex_point_map
@ -65,17 +65,17 @@ namespace Surface_mesh_simplification
} }
} }
CGAL_ECMS_TRACE(0,"EdgeCollapse of ECM with " << (num_edges(aSurface)/2) << " edges" ); CGAL_SMS_TRACE(0,"EdgeCollapse of TM with " << (num_edges(aSurface)/2) << " edges" );
CGAL_ECMS_DEBUG_CODE ( mStep = 0 ; ) CGAL_SMS_DEBUG_CODE ( mStep = 0 ; )
#ifdef CGAL_SURFACE_SIMPLIFICATION_ENABLE_TRACE #ifdef CGAL_SURFACE_SIMPLIFICATION_ENABLE_TRACE
vertex_iterator vb, ve ; vertex_iterator vb, ve ;
for ( boost::tie(vb,ve) = vertices(mSurface) ; vb != ve ; ++ vb ) for ( boost::tie(vb,ve) = vertices(mSurface) ; vb != ve ; ++ vb )
CGAL_ECMS_TRACE(1, vertex_to_string(*vb) ) ; CGAL_SMS_TRACE(1, vertex_to_string(*vb) ) ;
for ( boost::tie(eb,ee) = halfedges(mSurface); eb!=ee; ++eb ) for ( boost::tie(eb,ee) = halfedges(mSurface); eb!=ee; ++eb )
CGAL_ECMS_TRACE(1, edge_to_string(*eb) ) ; CGAL_SMS_TRACE(1, edge_to_string(*eb) ) ;
#endif #endif
} }
@ -92,7 +92,7 @@ namespace Surface_mesh_simplification
// Then proceed to collapse each edge in turn // Then proceed to collapse each edge in turn
Loop(); Loop();
CGAL_ECMS_TRACE(0,"Finished: " << (mInitialEdgeCount - mCurrentEdgeCount) << " edges removed." ) ; CGAL_SMS_TRACE(0,"Finished: " << (mInitialEdgeCount - mCurrentEdgeCount) << " edges removed." ) ;
int r = (int)(mInitialEdgeCount - mCurrentEdgeCount) ; int r = (int)(mInitialEdgeCount - mCurrentEdgeCount) ;
@ -104,7 +104,7 @@ namespace Surface_mesh_simplification
template<class M,class SP, class VIM, class VPM,class EIM,class ECTM, class CF,class PF,class V> template<class M,class SP, class VIM, class VPM,class EIM,class ECTM, class CF,class PF,class V>
void EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Collect() void EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Collect()
{ {
CGAL_ECMS_TRACE(0,"Collecting edges..."); CGAL_SMS_TRACE(0,"Collecting edges...");
// //
// Loop over all the _undirected_ edges in the surface putting them in the PQ // Loop over all the _undirected_ edges in the surface putting them in the PQ
@ -158,7 +158,7 @@ namespace Surface_mesh_simplification
} }
CGAL_ECMS_TRACE(2,edge_to_string(lEdge)); CGAL_SMS_TRACE(2,edge_to_string(lEdge));
} }
CGAL_SURF_SIMPL_TEST_assertion ( lInserted + lNotInserted == mInitialEdgeCount ) ; CGAL_SURF_SIMPL_TEST_assertion ( lInserted + lNotInserted == mInitialEdgeCount ) ;
@ -179,7 +179,7 @@ namespace Surface_mesh_simplification
zero_length_edges.erase( lEdge_to_remove ); zero_length_edges.erase( lEdge_to_remove );
Edge_data& lData = get_data(lEdge_to_remove) ; Edge_data& lData = get_data(lEdge_to_remove) ;
if ( lData.is_in_PQ() ){ if ( lData.is_in_PQ() ){
CGAL_ECMS_TRACE(2,"Removing E" << get(Edge_index_map,lEdge_to_remove) << " from PQ" ); CGAL_SMS_TRACE(2,"Removing E" << get(Edge_index_map,lEdge_to_remove) << " from PQ" );
remove_from_PQ(lEdge_to_remove,lData); remove_from_PQ(lEdge_to_remove,lData);
} }
--mCurrentEdgeCount; --mCurrentEdgeCount;
@ -193,7 +193,7 @@ namespace Surface_mesh_simplification
zero_length_edges.erase( lEdge_to_remove ); zero_length_edges.erase( lEdge_to_remove );
Edge_data& lData = get_data(lEdge_to_remove) ; Edge_data& lData = get_data(lEdge_to_remove) ;
if ( lData.is_in_PQ() ){ if ( lData.is_in_PQ() ){
CGAL_ECMS_TRACE(2,"Removing E" << get(Edge_index_map,lEdge_to_remove) << " from PQ" ); CGAL_SMS_TRACE(2,"Removing E" << get(Edge_index_map,lEdge_to_remove) << " from PQ" );
remove_from_PQ(lEdge_to_remove,lData); remove_from_PQ(lEdge_to_remove,lData);
} }
--mCurrentEdgeCount; --mCurrentEdgeCount;
@ -209,13 +209,13 @@ namespace Surface_mesh_simplification
Visitor.OnCollapsed(lProfile,rResult); Visitor.OnCollapsed(lProfile,rResult);
} }
CGAL_ECMS_TRACE(0,"Initial edge count: " << mInitialEdgeCount ) ; CGAL_SMS_TRACE(0,"Initial edge count: " << mInitialEdgeCount ) ;
} }
template<class M,class SP, class VIM, class VPM,class EIM,class ECTM, class CF,class PF,class V> template<class M,class SP, class VIM, class VPM,class EIM,class ECTM, class CF,class PF,class V>
void EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Loop() void EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Loop()
{ {
CGAL_ECMS_TRACE(0,"Collapsing edges...") ; CGAL_SMS_TRACE(0,"Collapsing edges...") ;
CGAL_SURF_SIMPL_TEST_assertion_code ( size_type lLoop_watchdog = 0 ) ; CGAL_SURF_SIMPL_TEST_assertion_code ( size_type lLoop_watchdog = 0 ) ;
CGAL_SURF_SIMPL_TEST_assertion_code ( size_type lNonCollapsableCount = 0 ) ; CGAL_SURF_SIMPL_TEST_assertion_code ( size_type lNonCollapsableCount = 0 ) ;
@ -231,7 +231,7 @@ namespace Surface_mesh_simplification
{ {
CGAL_SURF_SIMPL_TEST_assertion ( lLoop_watchdog ++ < mInitialEdgeCount ) ; CGAL_SURF_SIMPL_TEST_assertion ( lLoop_watchdog ++ < mInitialEdgeCount ) ;
CGAL_ECMS_TRACE(1,"Popped " << edge_to_string(*lEdge) ) ; CGAL_SMS_TRACE(1,"Popped " << edge_to_string(*lEdge) ) ;
CGAL_assertion( !is_constrained(*lEdge) ); CGAL_assertion( !is_constrained(*lEdge) );
@ -247,7 +247,7 @@ namespace Surface_mesh_simplification
{ {
Visitor.OnStopConditionReached(lProfile); Visitor.OnStopConditionReached(lProfile);
CGAL_ECMS_TRACE(0,"Stop condition reached with InitialEdgeCount=" << mInitialEdgeCount CGAL_SMS_TRACE(0,"Stop condition reached with InitialEdgeCount=" << mInitialEdgeCount
<< " CurrentEdgeCount=" << mCurrentEdgeCount << " CurrentEdgeCount=" << mCurrentEdgeCount
<< " Current Edge: " << edge_to_string(*lEdge) << " Current Edge: " << edge_to_string(*lEdge)
); );
@ -284,12 +284,12 @@ namespace Surface_mesh_simplification
Visitor.OnNonCollapsable(lProfile); Visitor.OnNonCollapsable(lProfile);
CGAL_ECMS_TRACE(1,edge_to_string(*lEdge) << " NOT Collapsable" ); CGAL_SMS_TRACE(1,edge_to_string(*lEdge) << " NOT Collapsable" );
} }
} }
else else
{ {
CGAL_ECMS_TRACE(1,edge_to_string(*lEdge) << " uncomputable cost." ); CGAL_SMS_TRACE(1,edge_to_string(*lEdge) << " uncomputable cost." );
} }
} }
} }
@ -349,23 +349,23 @@ bool EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Is_collapse_topologically_vali
{ {
bool rR = true ; bool rR = true ;
CGAL_ECMS_TRACE(3,"Testing topological collapsabilty of p_q=V" << get(Vertex_index_map,aProfile.v0()) << "(%" << degree(aProfile.v0(),mSurface) << ")" CGAL_SMS_TRACE(3,"Testing topological collapsabilty of p_q=V" << get(Vertex_index_map,aProfile.v0()) << "(%" << degree(aProfile.v0(),mSurface) << ")"
<< "->V" << get(Vertex_index_map,aProfile.v1()) << "(%" << degree(aProfile.v1(),mSurface) << ")" << "->V" << get(Vertex_index_map,aProfile.v1()) << "(%" << degree(aProfile.v1(),mSurface) << ")"
); );
CGAL_ECMS_TRACE(4, "is p_q border:" << aProfile.is_v0_v1_a_border() ); CGAL_SMS_TRACE(4, "is p_q border:" << aProfile.is_v0_v1_a_border() );
CGAL_ECMS_TRACE(4, "is q_q border:" << aProfile.is_v1_v0_a_border() ); CGAL_SMS_TRACE(4, "is q_q border:" << aProfile.is_v1_v0_a_border() );
out_edge_iterator eb1, ee1 ; out_edge_iterator eb1, ee1 ;
out_edge_iterator eb2, ee2 ; out_edge_iterator eb2, ee2 ;
CGAL_ECMS_TRACE(4," t=V" CGAL_SMS_TRACE(4," t=V"
<< ( aProfile.left_face_exists() ? get(Vertex_index_map,aProfile.vL()) : -1 ) << ( aProfile.left_face_exists() ? get(Vertex_index_map,aProfile.vL()) : -1 )
<< "(%" << "(%"
<< ( aProfile.left_face_exists() ? degree(aProfile.vL(),mSurface) : 0 ) << ( aProfile.left_face_exists() ? degree(aProfile.vL(),mSurface) : 0 )
<< ")" << ")"
); );
CGAL_ECMS_TRACE(4," b=V" CGAL_SMS_TRACE(4," b=V"
<< ( aProfile.right_face_exists() ? get(Vertex_index_map,aProfile.vR()) : -1 ) << ( aProfile.right_face_exists() ? get(Vertex_index_map,aProfile.vR()) : -1 )
<< "(%" << "(%"
<< ( aProfile.right_face_exists() ? degree(aProfile.vR(),mSurface) :0 ) << ( aProfile.right_face_exists() ? degree(aProfile.vR(),mSurface) :0 )
@ -453,13 +453,13 @@ bool EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Is_collapse_topologically_vali
if ( !lIsFace ) if ( !lIsFace )
{ {
CGAL_ECMS_TRACE(3," k=V" << get(Vertex_index_map,k) << " IS NOT in a face with p-q. NON-COLLAPSABLE edge." ) ; CGAL_SMS_TRACE(3," k=V" << get(Vertex_index_map,k) << " IS NOT in a face with p-q. NON-COLLAPSABLE edge." ) ;
rR = false ; rR = false ;
break ; break ;
} }
else else
{ {
CGAL_ECMS_TRACE(4," k=V" << get(Vertex_index_map,k) << " is in a face with p-q") ; CGAL_SMS_TRACE(4," k=V" << get(Vertex_index_map,k) << " is in a face with p-q") ;
} }
} }
} }
@ -477,7 +477,7 @@ bool EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Is_collapse_topologically_vali
if ( Is_open_triangle(aProfile.v0_v1()) ) if ( Is_open_triangle(aProfile.v0_v1()) )
{ {
rR = false ; rR = false ;
CGAL_ECMS_TRACE(3," p-q belongs to an open triangle. NON-COLLAPSABLE edge." ) ; CGAL_SMS_TRACE(3," p-q belongs to an open triangle. NON-COLLAPSABLE edge." ) ;
} }
} }
else if ( aProfile.is_v1_v0_a_border() ) else if ( aProfile.is_v1_v0_a_border() )
@ -485,7 +485,7 @@ bool EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Is_collapse_topologically_vali
if ( Is_open_triangle(aProfile.v1_v0()) ) if ( Is_open_triangle(aProfile.v1_v0()) )
{ {
rR = false ; rR = false ;
CGAL_ECMS_TRACE(3," p-q belongs to an open triangle. NON-COLLAPSABLE edge." ) ; CGAL_SMS_TRACE(3," p-q belongs to an open triangle. NON-COLLAPSABLE edge." ) ;
} }
} }
else else
@ -493,7 +493,7 @@ bool EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Is_collapse_topologically_vali
if ( is_border(aProfile.v0()) && is_border(aProfile.v1()) ) if ( is_border(aProfile.v0()) && is_border(aProfile.v1()) )
{ {
rR = false ; rR = false ;
CGAL_ECMS_TRACE(3," both p and q are boundary vertices but p-q is not. NON-COLLAPSABLE edge." ) ; CGAL_SMS_TRACE(3," both p and q are boundary vertices but p-q is not. NON-COLLAPSABLE edge." ) ;
} }
else else
{ {
@ -504,7 +504,7 @@ bool EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Is_collapse_topologically_vali
if ( lTetra ) if ( lTetra )
{ {
rR = false ; rR = false ;
CGAL_ECMS_TRACE(3," p-q belongs to a tetrahedron. NON-COLLAPSABLE edge." ) ; CGAL_SMS_TRACE(3," p-q belongs to a tetrahedron. NON-COLLAPSABLE edge." ) ;
} }
} }
} }
@ -531,7 +531,7 @@ bool EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Is_open_triangle( halfedge_des
if ( next(h3,mSurface) == h1 ) if ( next(h3,mSurface) == h1 )
{ {
// Now check if it is open // Now check if it is open
CGAL_ECMS_TRACE(4," p-q is a border edge... checking E" << get(Edge_index_map,h2) << " and E" << get(Edge_index_map,h3) ) ; CGAL_SMS_TRACE(4," p-q is a border edge... checking E" << get(Edge_index_map,h2) << " and E" << get(Edge_index_map,h3) ) ;
rR = is_border(h2) && is_border(h3); rR = is_border(h2) && is_border(h3);
@ -570,7 +570,7 @@ bool EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::are_shared_triangles_valid( Po
const double cMaxAreaRatio = 1e8 ; const double cMaxAreaRatio = 1e8 ;
CGAL_ECMS_TRACE(4," Testing validity of shared triangles:" CGAL_SMS_TRACE(4," Testing validity of shared triangles:"
<< "\n p0=" << xyz_to_string(p0) << "\n p1=" << xyz_to_string(p1) << "\n p2=" << xyz_to_string(p2) << "\n p3=" << xyz_to_string(p3) << "\n p0=" << xyz_to_string(p0) << "\n p1=" << xyz_to_string(p1) << "\n p2=" << xyz_to_string(p2) << "\n p3=" << xyz_to_string(p3)
<< "\n e01=" << xyz_to_string(e01) << "\n e02=" << xyz_to_string(e02) << "\n e03=" << xyz_to_string(e03) << "\n e01=" << xyz_to_string(e01) << "\n e02=" << xyz_to_string(e02) << "\n e03=" << xyz_to_string(e03)
<< "\n n012=" << xyz_to_string(n012) << "\n n023=" << xyz_to_string(n023) << "\n n012=" << xyz_to_string(n012) << "\n n023=" << xyz_to_string(n023)
@ -580,7 +580,7 @@ bool EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::are_shared_triangles_valid( Po
if ( larger < cMaxAreaRatio * smaller ) if ( larger < cMaxAreaRatio * smaller )
{ {
FT l0123 = Traits().compute_scalar_product_3_object()(n012, n023) ; FT l0123 = Traits().compute_scalar_product_3_object()(n012, n023) ;
CGAL_ECMS_TRACE(4,"\n l0123=" << n_to_string(l0123) ); CGAL_SMS_TRACE(4,"\n l0123=" << n_to_string(l0123) );
if ( CGAL_NTS is_positive(l0123) ) if ( CGAL_NTS is_positive(l0123) )
{ {
@ -588,7 +588,7 @@ bool EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::are_shared_triangles_valid( Po
} }
else else
{ {
CGAL_ECMS_TRACE(4,"\n lhs: " << n_to_string(( l0123 * l0123 ) / ( l012 * l023 )) << " <= rhs: " << mcMaxDihedralAngleCos2 ) ; CGAL_SMS_TRACE(4,"\n lhs: " << n_to_string(( l0123 * l0123 ) / ( l012 * l023 )) << " <= rhs: " << mcMaxDihedralAngleCos2 ) ;
if ( ( l0123 * l0123 ) <= mcMaxDihedralAngleCos2 * ( l012 * l023 ) ) if ( ( l0123 * l0123 ) <= mcMaxDihedralAngleCos2 * ( l012 * l023 ) )
{ {
@ -660,7 +660,7 @@ bool EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Is_collapse_geometrically_vali
CGAL_ECMS_TRACE(3,"Testing geometrical collapsabilty of v0-v1=E" << get(Edge_index_map,aProfile.v0_v1()) ); CGAL_SMS_TRACE(3,"Testing geometrical collapsabilty of v0-v1=E" << get(Edge_index_map,aProfile.v0_v1()) );
if ( k0 ) if ( k0 )
{ {
// Use the current link to extract all local triangles incident to 'vx' in the collapsed mesh (which at this point doesn't exist yet) // Use the current link to extract all local triangles incident to 'vx' in the collapsed mesh (which at this point doesn't exist yet)
@ -680,7 +680,7 @@ bool EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Is_collapse_geometrically_vali
vertex_descriptor k2 = * l ; vertex_descriptor k2 = * l ;
vertex_descriptor k3 = *nx ; vertex_descriptor k3 = *nx ;
CGAL_ECMS_TRACE(4," Screening link vertices k1=V" << get(Vertex_index_map,k1) << " k2=V" << get(Vertex_index_map,k2) << " k3=V" << get(Vertex_index_map,k3) ) ; CGAL_SMS_TRACE(4," Screening link vertices k1=V" << get(Vertex_index_map,k1) << " k2=V" << get(Vertex_index_map,k2) << " k3=V" << get(Vertex_index_map,k3) ) ;
halfedge_descriptor e12 = find_connection(k1,k2); halfedge_descriptor e12 = find_connection(k1,k2);
halfedge_descriptor e23 = k3 != k1 ? find_connection(k2,k3) : halfedge_descriptor() ; halfedge_descriptor e23 = k3 != k1 ? find_connection(k2,k3) : halfedge_descriptor() ;
@ -688,11 +688,11 @@ bool EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Is_collapse_geometrically_vali
// If 'k1-k2-k3' are connected there will be two adjacent triangles 'k0,k1,k2' and 'k0,k2,k3' after the collapse. // If 'k1-k2-k3' are connected there will be two adjacent triangles 'k0,k1,k2' and 'k0,k2,k3' after the collapse.
if ( handle_assigned(e12) && handle_assigned(e23) ) if ( handle_assigned(e12) && handle_assigned(e23) )
{ {
CGAL_ECMS_TRACE(4," Link triangles shared" ) ; CGAL_SMS_TRACE(4," Link triangles shared" ) ;
if ( !are_shared_triangles_valid( *k0, get_point(k1), get_point(k2), get_point(k3) ) ) if ( !are_shared_triangles_valid( *k0, get_point(k1), get_point(k2), get_point(k3) ) )
{ {
CGAL_ECMS_TRACE(3," Triangles VX-V" << get(Vertex_index_map,k1) << "-V" << get(Vertex_index_map,k2) << " and VX-V" << get(Vertex_index_map,k3) << " are not geometrically valid. Collapse rejected"); CGAL_SMS_TRACE(3," Triangles VX-V" << get(Vertex_index_map,k1) << "-V" << get(Vertex_index_map,k2) << " and VX-V" << get(Vertex_index_map,k3) << " are not geometrically valid. Collapse rejected");
rR = false ; rR = false ;
} }
} }
@ -705,11 +705,11 @@ bool EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Is_collapse_geometrically_vali
// There is indeed a triangle shared along e12 // There is indeed a triangle shared along e12
if ( handle_assigned(k4) ) if ( handle_assigned(k4) )
{ {
CGAL_ECMS_TRACE(4," Found exterior link triangle shared along E" << get(Edge_index_map,e12) << " with third vertex: V" << get(Vertex_index_map,k4) ) ; CGAL_SMS_TRACE(4," Found exterior link triangle shared along E" << get(Edge_index_map,e12) << " with third vertex: V" << get(Vertex_index_map,k4) ) ;
if ( !are_shared_triangles_valid( get_point(k1), get_point(k4), get_point(k2), *k0 ) ) if ( !are_shared_triangles_valid( get_point(k1), get_point(k4), get_point(k2), *k0 ) )
{ {
CGAL_ECMS_TRACE(3," Triangles V" << get(Vertex_index_map,k1) << "-V" << get(Vertex_index_map,k4) << " and V" << get(Vertex_index_map,k2) << "-VX are not geometrically valid. Collapse rejected"); CGAL_SMS_TRACE(3," Triangles V" << get(Vertex_index_map,k1) << "-V" << get(Vertex_index_map,k4) << " and V" << get(Vertex_index_map,k2) << "-VX are not geometrically valid. Collapse rejected");
rR = false ; rR = false ;
} }
} }
@ -723,11 +723,11 @@ bool EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Is_collapse_geometrically_vali
// There is indeed a triangle shared along e12 // There is indeed a triangle shared along e12
if ( handle_assigned(k5) ) if ( handle_assigned(k5) )
{ {
CGAL_ECMS_TRACE(4," Found exterior link triangle shared along E" << get(Edge_index_map,e23) << " with third vertex: V" << get(Vertex_index_map,k5) ) ; CGAL_SMS_TRACE(4," Found exterior link triangle shared along E" << get(Edge_index_map,e23) << " with third vertex: V" << get(Vertex_index_map,k5) ) ;
if ( !are_shared_triangles_valid( get_point(k2), get_point(k5), get_point(k3), *k0 ) ) if ( !are_shared_triangles_valid( get_point(k2), get_point(k5), get_point(k3), *k0 ) )
{ {
CGAL_ECMS_TRACE(3," Triangles V" << get(Vertex_index_map,k2) << "-V" << get(Vertex_index_map,k5) << " and V" << get(Vertex_index_map,k3) << "-VX are not geometrically valid. Collapse rejected"); CGAL_SMS_TRACE(3," Triangles V" << get(Vertex_index_map,k2) << "-V" << get(Vertex_index_map,k5) << " and V" << get(Vertex_index_map,k3) << "-VX are not geometrically valid. Collapse rejected");
rR = false ; rR = false ;
} }
} }
@ -743,7 +743,7 @@ template<class M, class SP, class VIM, class VPM,class EIM,class ECTM, class CF,
void EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Collapse( Profile const& aProfile, Placement_type aPlacement ) void EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Collapse( Profile const& aProfile, Placement_type aPlacement )
{ {
CGAL_ECMS_TRACE(1,"S" << mStep << ". Collapsing " << edge_to_string(aProfile.v0_v1()) ) ; CGAL_SMS_TRACE(1,"S" << mStep << ". Collapsing " << edge_to_string(aProfile.v0_v1()) ) ;
vertex_descriptor rResult ; vertex_descriptor rResult ;
@ -764,14 +764,14 @@ void EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Collapse( Profile const& aProf
if ( is_constrained(lV0VL) ) //make sure a constrained edge will not disappear if ( is_constrained(lV0VL) ) //make sure a constrained edge will not disappear
lV0VL=primary_edge(aProfile.v1_vL()); lV0VL=primary_edge(aProfile.v1_vL());
CGAL_ECMS_TRACE(3,"V0VL E" << get(Edge_index_map,lV0VL) CGAL_SMS_TRACE(3,"V0VL E" << get(Edge_index_map,lV0VL)
<< "(V" << get(Vertex_index_map, source(lV0VL,mSurface)) << "->V" << get(Vertex_index_map,target(lV0VL,mSurface)) << ")" << "(V" << get(Vertex_index_map, source(lV0VL,mSurface)) << "->V" << get(Vertex_index_map,target(lV0VL,mSurface)) << ")"
) ; ) ;
Edge_data& lData = get_data(lV0VL) ; Edge_data& lData = get_data(lV0VL) ;
if ( lData.is_in_PQ() ) if ( lData.is_in_PQ() )
{ {
CGAL_ECMS_TRACE(2,"Removing E" << get(Edge_index_map,lV0VL) << " from PQ" ) ; CGAL_SMS_TRACE(2,"Removing E" << get(Edge_index_map,lV0VL) << " from PQ" ) ;
remove_from_PQ(lV0VL,lData) ; remove_from_PQ(lV0VL,lData) ;
} }
@ -785,21 +785,21 @@ void EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Collapse( Profile const& aProf
if ( is_constrained(lVRV1) ) //make sure a constrained edge will not disappear if ( is_constrained(lVRV1) ) //make sure a constrained edge will not disappear
lVRV1=primary_edge(aProfile.v0_vR()); lVRV1=primary_edge(aProfile.v0_vR());
CGAL_ECMS_TRACE(3,"V1VRE" << get(Edge_index_map,lVRV1) CGAL_SMS_TRACE(3,"V1VRE" << get(Edge_index_map,lVRV1)
<< "(V" << get(Vertex_index_map, source(lVRV1,mSurface)) << "->V" << get(Vertex_index_map, target(lVRV1,mSurface)) << ")" << "(V" << get(Vertex_index_map, source(lVRV1,mSurface)) << "->V" << get(Vertex_index_map, target(lVRV1,mSurface)) << ")"
) ; ) ;
Edge_data& lData = get_data(lVRV1) ; Edge_data& lData = get_data(lVRV1) ;
if ( lData.is_in_PQ() ) if ( lData.is_in_PQ() )
{ {
CGAL_ECMS_TRACE(2,"Removing E" << get(Edge_index_map,lVRV1) << " from PQ") ; CGAL_SMS_TRACE(2,"Removing E" << get(Edge_index_map,lVRV1) << " from PQ") ;
remove_from_PQ(lVRV1,lData) ; remove_from_PQ(lVRV1,lData) ;
} }
-- mCurrentEdgeCount ; -- mCurrentEdgeCount ;
CGAL_SURF_SIMPL_TEST_assertion_code( -- lResultingEdgeCount ) ; CGAL_SURF_SIMPL_TEST_assertion_code( -- lResultingEdgeCount ) ;
} }
CGAL_ECMS_TRACE(1,"Removing:\n v0v1: E" << get(Edge_index_map,aProfile.v0_v1()) << "(V" << get(Vertex_index_map,aProfile.v0()) << "->V" << get(Vertex_index_map,aProfile.v1()) << ")" ); CGAL_SMS_TRACE(1,"Removing:\n v0v1: E" << get(Edge_index_map,aProfile.v0_v1()) << "(V" << get(Vertex_index_map,aProfile.v0()) << "->V" << get(Vertex_index_map,aProfile.v1()) << ")" );
// Perform the actuall collapse. // Perform the actuall collapse.
@ -820,17 +820,17 @@ void EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Collapse( Profile const& aProf
CGAL_SURF_SIMPL_TEST_assertion( mSurface.is_valid() && mSurface.is_pure_triangle() ) ; CGAL_SURF_SIMPL_TEST_assertion( mSurface.is_valid() && mSurface.is_pure_triangle() ) ;
CGAL_ECMS_TRACE(1,"V" << get(Vertex_index_map,rResult) << " kept." ) ; CGAL_SMS_TRACE(1,"V" << get(Vertex_index_map,rResult) << " kept." ) ;
#ifdef CGAL_SURFACE_SIMPLIFICATION_ENABLE_TRACE #ifdef CGAL_SURFACE_SIMPLIFICATION_ENABLE_TRACE
out_edge_iterator eb1, ee1 ; out_edge_iterator eb1, ee1 ;
for ( boost::tie(eb1,ee1) = halfedges_around_source(rResult,mSurface) ; eb1 != ee1 ; ++ eb1 ) for ( boost::tie(eb1,ee1) = halfedges_around_source(rResult,mSurface) ; eb1 != ee1 ; ++ eb1 )
CGAL_ECMS_TRACE(2, edge_to_string(*eb1) ) ; CGAL_SMS_TRACE(2, edge_to_string(*eb1) ) ;
#endif #endif
if ( aPlacement ) if ( aPlacement )
{ {
CGAL_ECMS_TRACE(1,"New vertex point: " << xyz_to_string(*aPlacement) ) ; CGAL_SMS_TRACE(1,"New vertex point: " << xyz_to_string(*aPlacement) ) ;
put(Vertex_point_map,rResult,*aPlacement) ; put(Vertex_point_map,rResult,*aPlacement) ;
} }
@ -838,13 +838,13 @@ void EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Collapse( Profile const& aProf
Update_neighbors(rResult) ; Update_neighbors(rResult) ;
CGAL_ECMS_DEBUG_CODE ( ++mStep ; ) CGAL_SMS_DEBUG_CODE ( ++mStep ; )
} }
template<class M, class SP, class VIM, class VPM,class EIM,class ECTM, class CF,class PF,class V> template<class M, class SP, class VIM, class VPM,class EIM,class ECTM, class CF,class PF,class V>
void EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Update_neighbors( vertex_descriptor const& aKeptV ) void EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Update_neighbors( vertex_descriptor const& aKeptV )
{ {
CGAL_ECMS_TRACE(3,"Updating cost of neighboring edges..." ) ; CGAL_SMS_TRACE(3,"Updating cost of neighboring edges..." ) ;
// //
// (A) Collect all edges to update their cost: all those around each vertex adjacent to the vertex kept // (A) Collect all edges to update their cost: all those around each vertex adjacent to the vertex kept
@ -870,7 +870,7 @@ void EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Update_neighbors( vertex_descr
halfedge_descriptor lEdge2 = primary_edge(*eb2) ; halfedge_descriptor lEdge2 = primary_edge(*eb2) ;
Edge_data& lData2 = get_data(lEdge2); Edge_data& lData2 = get_data(lEdge2);
CGAL_ECMS_TRACE(4,"Inedge around V" << get(Vertex_index_map,lAdj_k) << edge_to_string(lEdge2) ) ; CGAL_SMS_TRACE(4,"Inedge around V" << get(Vertex_index_map,lAdj_k) << edge_to_string(lEdge2) ) ;
// Only edges still in the PQ needs to be updated, the other needs to be re-inserted // Only edges still in the PQ needs to be updated, the other needs to be re-inserted
if ( lData2.is_in_PQ() ) if ( lData2.is_in_PQ() )
@ -894,7 +894,7 @@ void EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Update_neighbors( vertex_descr
lData.cost() = get_cost(lProfile) ; lData.cost() = get_cost(lProfile) ;
CGAL_ECMS_TRACE(3, edge_to_string(lEdge) << " updated in the PQ") ; CGAL_SMS_TRACE(3, edge_to_string(lEdge) << " updated in the PQ") ;
update_in_PQ(lEdge,lData); update_in_PQ(lEdge,lData);
} }
@ -916,7 +916,7 @@ void EdgeCollapse<M,SP,VIM,VPM,EIM,ECTM,CF,PF,V>::Update_neighbors( vertex_descr
lData.cost() = get_cost(lProfile) ; lData.cost() = get_cost(lProfile) ;
CGAL_ECMS_TRACE(3, edge_to_string(lEdge) << " re-inserted in the PQ") ; CGAL_SMS_TRACE(3, edge_to_string(lEdge) << " re-inserted in the PQ") ;
insert_in_PQ(lEdge,lData); insert_in_PQ(lEdge,lData);
} }

View File

@ -31,25 +31,25 @@ namespace CGAL {
namespace Surface_mesh_simplification namespace Surface_mesh_simplification
{ {
template<class ECM_> template<class TM_>
struct Edge_collapse_visitor_base struct Edge_collapse_visitor_base
{ {
typedef ECM_ ECM ; typedef TM_ TM ;
typedef Edge_profile<ECM> Profile ; typedef Edge_profile<TM> Profile ;
typedef boost::graph_traits <ECM> GraphTraits ; typedef boost::graph_traits <TM> GraphTraits ;
typedef typename GraphTraits::edges_size_type size_type ; typedef typename GraphTraits::edges_size_type size_type ;
typedef typename GraphTraits::vertex_descriptor vertex_descriptor ; typedef typename GraphTraits::vertex_descriptor vertex_descriptor ;
typedef typename boost::property_map<ECM, CGAL::vertex_point_t>::type Vertex_point_pmap; typedef typename boost::property_map<TM, CGAL::vertex_point_t>::type Vertex_point_pmap;
typedef typename boost::property_traits<Vertex_point_pmap>::value_type Point; typedef typename boost::property_traits<Vertex_point_pmap>::value_type Point;
typedef typename Kernel_traits<Point>::Kernel Kernel ; typedef typename Kernel_traits<Point>::Kernel Kernel ;
typedef typename Kernel::FT FT ; typedef typename Kernel::FT FT ;
void OnStarted( ECM& ) {} void OnStarted( TM& ) {}
void OnFinished ( ECM& ) {} void OnFinished ( TM& ) {}
void OnStopConditionReached( Profile const& ) {} void OnStopConditionReached( Profile const& ) {}

View File

@ -33,7 +33,7 @@ class Bounded_normal_change_placement
{ {
public: public:
typedef typename Placement::ECM ECM ; typedef typename Placement::TM TM ;
public: public:

View File

@ -49,8 +49,8 @@ public:
template <typename Profile> template <typename Profile>
optional<typename Profile::Point> operator()( Profile const& aProfile ) const optional<typename Profile::Point> operator()( Profile const& aProfile ) const
{ {
typedef typename Profile::ECM ECM; typedef typename Profile::TM TM;
typedef typename CGAL::Halfedge_around_target_iterator<ECM> in_edge_iterator; typedef typename CGAL::Halfedge_around_target_iterator<TM> in_edge_iterator;
in_edge_iterator eb, ee ; in_edge_iterator eb, ee ;
for ( boost::tie(eb,ee) = halfedges_around_target(aProfile.v0(),aProfile.surface_mesh()); for ( boost::tie(eb,ee) = halfedges_around_target(aProfile.v0(),aProfile.surface_mesh());

View File

@ -42,17 +42,17 @@ namespace Surface_mesh_simplification
// //
// Stops when the ratio of initial to current vertex pairs is below some value. // Stops when the ratio of initial to current vertex pairs is below some value.
// //
template<class ECM_> template<class TM_>
class Count_ratio_stop_predicate class Count_ratio_stop_predicate
{ {
public: public:
typedef ECM_ ECM ; typedef TM_ TM ;
typedef Edge_profile<ECM> Profile ; typedef Edge_profile<TM> Profile ;
typedef typename boost::graph_traits<ECM>::edge_descriptor edge_descriptor ; typedef typename boost::graph_traits<TM>::edge_descriptor edge_descriptor ;
typedef typename boost::graph_traits<ECM>::edges_size_type size_type ; typedef typename boost::graph_traits<TM>::edges_size_type size_type ;
Count_ratio_stop_predicate( double aRatio ) : mRatio(aRatio) {} Count_ratio_stop_predicate( double aRatio ) : mRatio(aRatio) {}

View File

@ -42,16 +42,16 @@ namespace Surface_mesh_simplification
// //
// Stops when the number of edges left falls below a given number. // Stops when the number of edges left falls below a given number.
// //
template<class ECM_> template<class TM_>
class Count_stop_predicate class Count_stop_predicate
{ {
public: public:
typedef ECM_ ECM ; typedef TM_ TM ;
// typedef Edge_profile<ECM> Profile ; // typedef Edge_profile<TM> Profile ;
typedef typename boost::graph_traits<ECM>::edges_size_type size_type ; typedef typename boost::graph_traits<TM>::edges_size_type size_type ;
// typedef typename Kernel::FT FT ; // typedef typename Kernel::FT FT ;

View File

@ -45,15 +45,15 @@ namespace CGAL {
namespace Surface_mesh_simplification namespace Surface_mesh_simplification
{ {
template<class ECM_, class Profile_> template<class TM_, class Profile_>
class LindstromTurkCore class LindstromTurkCore
{ {
public: public:
typedef ECM_ ECM ; typedef TM_ TM ;
typedef Profile_ Profile ; typedef Profile_ Profile ;
typedef boost::graph_traits<ECM> GraphTraits ; typedef boost::graph_traits<TM> GraphTraits ;
typedef typename GraphTraits::vertex_descriptor vertex_descriptor ; typedef typename GraphTraits::vertex_descriptor vertex_descriptor ;
typedef typename GraphTraits::halfedge_descriptor halfedge_descriptor ; typedef typename GraphTraits::halfedge_descriptor halfedge_descriptor ;
@ -63,9 +63,9 @@ public:
typedef typename Profile::Point Point ; typedef typename Profile::Point Point ;
typedef typename Profile::VertexPointMap Vertex_point_pmap; typedef typename Profile::VertexPointMap Vertex_point_pmap;
typedef typename boost::property_traits<Vertex_point_pmap>::value_type ECM_Point; typedef typename boost::property_traits<Vertex_point_pmap>::value_type TM_Point;
typedef typename Kernel_traits<ECM_Point>::Kernel ECM_Kernel ; typedef typename Kernel_traits<TM_Point>::Kernel TM_Kernel ;
typedef typename Kernel_traits<Point>::Kernel Kernel; typedef typename Kernel_traits<Point>::Kernel Kernel;
typedef typename Kernel::Vector_3 Vector ; typedef typename Kernel::Vector_3 Vector ;
@ -164,7 +164,7 @@ private :
template<class T> template<class T>
static optional<T> filter_infinity ( T const& n ) { return is_finite(n) ? optional<T>(n) : optional<T>() ; } static optional<T> filter_infinity ( T const& n ) { return is_finite(n) ? optional<T>(n) : optional<T>() ; }
ECM& surface() const { return mProfile.surface() ; } TM& surface() const { return mProfile.surface() ; }
private: private:
@ -184,7 +184,7 @@ private:
Matrix mConstraints_A ; Matrix mConstraints_A ;
Vector mConstraints_b ; Vector mConstraints_b ;
Cartesian_converter<ECM_Kernel,Kernel> convert ; Cartesian_converter<TM_Kernel,Kernel> convert ;
FT mSquared_cos_alpha; FT mSquared_cos_alpha;
FT mSquared_sin_alpha; FT mSquared_sin_alpha;

View File

@ -36,8 +36,8 @@ namespace CGAL {
namespace Surface_mesh_simplification namespace Surface_mesh_simplification
{ {
template<class ECM, class K> template<class TM, class K>
LindstromTurkCore<ECM,K>::LindstromTurkCore( Params const& aParams, Profile const& aProfile ) LindstromTurkCore<TM,K>::LindstromTurkCore( Params const& aParams, Profile const& aProfile )
: :
mParams(aParams) mParams(aParams)
,mProfile(aProfile) ,mProfile(aProfile)
@ -57,8 +57,8 @@ LindstromTurkCore<ECM,K>::LindstromTurkCore( Params const& aParams, Profile cons
Extract_boundary_data(); Extract_boundary_data();
} }
template<class ECM, class K> template<class TM, class K>
void LindstromTurkCore<ECM,K>::Extract_boundary_data() void LindstromTurkCore<TM,K>::Extract_boundary_data()
{ {
mBdry_data.reserve(mProfile.border_edges().size()); mBdry_data.reserve(mProfile.border_edges().size());
for ( const_border_edge_iterator it = mProfile.border_edges().begin(), eit = mProfile.border_edges().end() ; it != eit ; ++ it ) for ( const_border_edge_iterator it = mProfile.border_edges().begin(), eit = mProfile.border_edges().end() ; it != eit ; ++ it )
@ -76,7 +76,7 @@ void LindstromTurkCore<ECM,K>::Extract_boundary_data()
Vector v = tp - sp ; Vector v = tp - sp ;
Vector n = Point_cross_product(tp,sp) ; Vector n = Point_cross_product(tp,sp) ;
CGAL_ECMS_LT_TRACE(1," Boundary edge. S:" << xyz_to_string(sp) << " T:" << xyz_to_string(tp) CGAL_SMS_LT_TRACE(1," Boundary edge. S:" << xyz_to_string(sp) << " T:" << xyz_to_string(tp)
<< " V:" << xyz_to_string(v) << " N:" << xyz_to_string(n) << " V:" << xyz_to_string(v) << " N:" << xyz_to_string(n)
) ; ) ;
@ -84,8 +84,8 @@ void LindstromTurkCore<ECM,K>::Extract_boundary_data()
} }
} }
template<class ECM, class K> template<class TM, class K>
void LindstromTurkCore<ECM,K>::Extract_triangle_data() void LindstromTurkCore<TM,K>::Extract_triangle_data()
{ {
mTriangle_data.reserve(mProfile.triangles().size()); mTriangle_data.reserve(mProfile.triangles().size());
for ( const_triangle_iterator it = mProfile.triangles().begin(), eit = mProfile.triangles().end() ; it != eit ; ++ it ) for ( const_triangle_iterator it = mProfile.triangles().begin(), eit = mProfile.triangles().end() ; it != eit ; ++ it )
@ -103,7 +103,7 @@ void LindstromTurkCore<ECM,K>::Extract_triangle_data()
FT lNormalL = Point_cross_product(p0,p1) * (p2-ORIGIN); FT lNormalL = Point_cross_product(p0,p1) * (p2-ORIGIN);
CGAL_ECMS_LT_TRACE(1," Extracting triangle v" << tri.v0 << "->v" << tri.v1 << "->v" << tri.v2 CGAL_SMS_LT_TRACE(1," Extracting triangle v" << tri.v0 << "->v" << tri.v1 << "->v" << tri.v2
<< " N:" << xyz_to_string(lNormalV) << " L:" << n_to_string(lNormalL) << " N:" << xyz_to_string(lNormalV) << " L:" << n_to_string(lNormalL)
); );
@ -111,13 +111,13 @@ void LindstromTurkCore<ECM,K>::Extract_triangle_data()
} }
} }
template<class ECM, class K> template<class TM, class K>
typename LindstromTurkCore<ECM,K>::Optional_point LindstromTurkCore<ECM,K>::compute_placement() typename LindstromTurkCore<TM,K>::Optional_point LindstromTurkCore<TM,K>::compute_placement()
{ {
Optional_point rPlacementP ; Optional_point rPlacementP ;
Optional_vector lPlacementV ; Optional_vector lPlacementV ;
CGAL_ECMS_LT_TRACE(0,"Computing LT placement for E" << mProfile.v0_v1() << " (V" << mProfile.v0() << "->V" << mProfile.v1() << ")" ); CGAL_SMS_LT_TRACE(0,"Computing LT placement for E" << mProfile.v0_v1() << " (V" << mProfile.v0() << "->V" << mProfile.v1() << ")" );
// //
// Each vertex constraint is an equation of the form: Ai * v = bi // Each vertex constraint is an equation of the form: Ai * v = bi
@ -164,21 +164,21 @@ typename LindstromTurkCore<ECM,K>::Optional_point LindstromTurkCore<ECM,K>::comp
{ {
Matrix const& lAi = *lOptional_Ai ; Matrix const& lAi = *lOptional_Ai ;
CGAL_ECMS_LT_TRACE(2," b: " << xyz_to_string(mConstraints_b) ); CGAL_SMS_LT_TRACE(2," b: " << xyz_to_string(mConstraints_b) );
CGAL_ECMS_LT_TRACE(2," inv(A): " << matrix_to_string(lAi) ); CGAL_SMS_LT_TRACE(2," inv(A): " << matrix_to_string(lAi) );
lPlacementV = filter_infinity(mConstraints_b * lAi) ; lPlacementV = filter_infinity(mConstraints_b * lAi) ;
CGAL_ECMS_LT_TRACE(0," New vertex point: " << xyz_to_string(*lPlacementV) ); CGAL_SMS_LT_TRACE(0," New vertex point: " << xyz_to_string(*lPlacementV) );
} }
else else
{ {
CGAL_ECMS_LT_TRACE(1," Can't solve optimization, singular system."); CGAL_SMS_LT_TRACE(1," Can't solve optimization, singular system.");
} }
} }
else else
{ {
CGAL_ECMS_LT_TRACE(1," Can't solve optimization, not enough alpha-compatible constraints."); CGAL_SMS_LT_TRACE(1," Can't solve optimization, not enough alpha-compatible constraints.");
} }
if ( lPlacementV ) if ( lPlacementV )
@ -187,14 +187,14 @@ typename LindstromTurkCore<ECM,K>::Optional_point LindstromTurkCore<ECM,K>::comp
return rPlacementP; return rPlacementP;
} }
template<class ECM, class K> template<class TM, class K>
typename LindstromTurkCore<ECM,K>::Optional_FT LindstromTurkCore<ECM,K>::compute_cost( Optional_point const& aP ) typename LindstromTurkCore<TM,K>::Optional_FT LindstromTurkCore<TM,K>::compute_cost( Optional_point const& aP )
{ {
Optional_FT rCost ; Optional_FT rCost ;
if ( aP ) if ( aP )
{ {
CGAL_ECMS_LT_TRACE(0,"Computing LT cost for E" << mProfile.v0_v1() ); CGAL_SMS_LT_TRACE(0,"Computing LT cost for E" << mProfile.v0_v1() );
Vector lV = (*aP) - ORIGIN ; Vector lV = (*aP) - ORIGIN ;
FT lSquaredLength = squared_distance(mProfile.p0(),mProfile.p1()); FT lSquaredLength = squared_distance(mProfile.p0(),mProfile.p1());
@ -209,7 +209,7 @@ typename LindstromTurkCore<ECM,K>::Optional_FT LindstromTurkCore<ECM,K>::compute
rCost = filter_infinity(lTotalCost); rCost = filter_infinity(lTotalCost);
CGAL_ECMS_LT_TRACE(0, " Squared edge length: " << n_to_string(lSquaredLength) CGAL_SMS_LT_TRACE(0, " Squared edge length: " << n_to_string(lSquaredLength)
<< "\n Boundary cost: " << n_to_string(lBdryCost) << " weight: " << mParams.BoundaryWeight << "\n Boundary cost: " << n_to_string(lBdryCost) << " weight: " << mParams.BoundaryWeight
<< "\n Volume cost: " << n_to_string(lVolumeCost) << " weight: " << mParams.VolumeWeight << "\n Volume cost: " << n_to_string(lVolumeCost) << " weight: " << mParams.VolumeWeight
<< "\n Shape cost: " << n_to_string(lShapeCost) << " weight: " << mParams.ShapeWeight << "\n Shape cost: " << n_to_string(lShapeCost) << " weight: " << mParams.ShapeWeight
@ -222,8 +222,8 @@ typename LindstromTurkCore<ECM,K>::Optional_FT LindstromTurkCore<ECM,K>::compute
} }
template<class ECM, class K> template<class TM, class K>
void LindstromTurkCore<ECM,K>::Add_boundary_preservation_constraints( Boundary_data_vector const& aBdry ) void LindstromTurkCore<TM,K>::Add_boundary_preservation_constraints( Boundary_data_vector const& aBdry )
{ {
if ( aBdry.size() > 0 ) if ( aBdry.size() > 0 )
@ -246,7 +246,7 @@ void LindstromTurkCore<ECM,K>::Add_boundary_preservation_constraints( Boundary_d
e1y = e1y + vy; e1y = e1y + vy;
e1z = e1z + vz; e1z = e1z + vz;
CGAL_ECMS_LT_TRACE(1," vx:" << n_to_string(vx) << " vy:" << n_to_string(vy) << " vz:" << n_to_string(vz) << " e1x:" CGAL_SMS_LT_TRACE(1," vx:" << n_to_string(vx) << " vy:" << n_to_string(vy) << " vz:" << n_to_string(vz) << " e1x:"
<< n_to_string(e1x) << " e1y:" << n_to_string(e1y) << " e1z:" << n_to_string(e1z) ); << n_to_string(e1x) << " e1y:" << n_to_string(e1y) << " e1z:" << n_to_string(e1z) );
} }
@ -254,7 +254,7 @@ void LindstromTurkCore<ECM,K>::Add_boundary_preservation_constraints( Boundary_d
Vector c = cross_product(e1,e2); Vector c = cross_product(e1,e2);
CGAL_ECMS_LT_TRACE(1 CGAL_SMS_LT_TRACE(1
," Adding boundary preservation constraint." ," Adding boundary preservation constraint."
<< "\n SumV:" << xyz_to_string(e1) << "\n SumV:" << xyz_to_string(e1)
<< "\n SumN:" << xyz_to_string(e2) << "\n SumN:" << xyz_to_string(e2)
@ -266,10 +266,10 @@ void LindstromTurkCore<ECM,K>::Add_boundary_preservation_constraints( Boundary_d
} }
} }
template<class ECM, class K> template<class TM, class K>
void LindstromTurkCore<ECM,K>::Add_volume_preservation_constraints( Triangle_data_vector const& aTriangles ) void LindstromTurkCore<TM,K>::Add_volume_preservation_constraints( Triangle_data_vector const& aTriangles )
{ {
CGAL_ECMS_LT_TRACE(1," Adding volume preservation constraint. " << aTriangles.size() << " triangles."); CGAL_SMS_LT_TRACE(1," Adding volume preservation constraint. " << aTriangles.size() << " triangles.");
Vector lSumV = NULL_VECTOR ; Vector lSumV = NULL_VECTOR ;
FT lSumL(0) ; FT lSumL(0) ;
@ -280,18 +280,18 @@ void LindstromTurkCore<ECM,K>::Add_volume_preservation_constraints( Triangle_dat
lSumL = lSumL + it->NormalL ; lSumL = lSumL + it->NormalL ;
} }
CGAL_ECMS_LT_TRACE(1, " SumV:" << xyz_to_string(lSumV) << "\n SumL:" << n_to_string(lSumL) ); CGAL_SMS_LT_TRACE(1, " SumV:" << xyz_to_string(lSumV) << "\n SumL:" << n_to_string(lSumL) );
Add_constraint_if_alpha_compatible(lSumV,lSumL); Add_constraint_if_alpha_compatible(lSumV,lSumL);
} }
template<class ECM, class K> template<class TM, class K>
void LindstromTurkCore<ECM,K>::Add_boundary_and_volume_optimization_constraints( Boundary_data_vector const& aBdry void LindstromTurkCore<TM,K>::Add_boundary_and_volume_optimization_constraints( Boundary_data_vector const& aBdry
, Triangle_data_vector const& aTriangles , Triangle_data_vector const& aTriangles
) )
{ {
CGAL_ECMS_LT_TRACE(1," Adding boundary and volume optimization constraints. "); CGAL_SMS_LT_TRACE(1," Adding boundary and volume optimization constraints. ");
Matrix H = NULL_MATRIX ; Matrix H = NULL_MATRIX ;
Vector c = NULL_VECTOR ; Vector c = NULL_VECTOR ;
@ -308,7 +308,7 @@ void LindstromTurkCore<ECM,K>::Add_boundary_and_volume_optimization_constraints(
c = c - ( lTri.NormalL * lTri.NormalV ) ; c = c - ( lTri.NormalL * lTri.NormalV ) ;
} }
CGAL_ECMS_LT_TRACE(2," Hv:" << matrix_to_string(H) << "\n cv:" << xyz_to_string(c) ) ; CGAL_SMS_LT_TRACE(2," Hv:" << matrix_to_string(H) << "\n cv:" << xyz_to_string(c) ) ;
if ( aBdry.size() > 0 ) if ( aBdry.size() > 0 )
@ -328,7 +328,7 @@ void LindstromTurkCore<ECM,K>::Add_boundary_and_volume_optimization_constraints(
cb = cb + c ; cb = cb + c ;
} }
CGAL_ECMS_LT_TRACE(2," Hb:" << matrix_to_string(Hb) << "\n cb:" << xyz_to_string(cb) ) ; CGAL_SMS_LT_TRACE(2," Hb:" << matrix_to_string(Hb) << "\n cb:" << xyz_to_string(cb) ) ;
// //
// Weighted average // Weighted average
@ -341,16 +341,16 @@ void LindstromTurkCore<ECM,K>::Add_boundary_and_volume_optimization_constraints(
H += lScaledBoundaryWeight * Hb ; H += lScaledBoundaryWeight * Hb ;
c = c + ( lScaledBoundaryWeight * cb ) ; c = c + ( lScaledBoundaryWeight * cb ) ;
CGAL_ECMS_LT_TRACE(2," H:" << matrix_to_string(H) << "\n c:" << xyz_to_string(c) ) ; CGAL_SMS_LT_TRACE(2," H:" << matrix_to_string(H) << "\n c:" << xyz_to_string(c) ) ;
CGAL_ECMS_LT_TRACE(2," VolW:" << mParams.VolumeWeight << " BdryW:" << mParams.BoundaryWeight << " ScaledBdryW:" << lScaledBoundaryWeight ) ; CGAL_SMS_LT_TRACE(2," VolW:" << mParams.VolumeWeight << " BdryW:" << mParams.BoundaryWeight << " ScaledBdryW:" << lScaledBoundaryWeight ) ;
} }
Add_constraint_from_gradient(H,c); Add_constraint_from_gradient(H,c);
} }
template<class ECM, class K> template<class TM, class K>
void LindstromTurkCore<ECM,K>::Add_shape_optimization_constraints( vertex_descriptor_vector const& aLink ) void LindstromTurkCore<TM,K>::Add_shape_optimization_constraints( vertex_descriptor_vector const& aLink )
{ {
FT s((double)aLink.size()); FT s((double)aLink.size());
@ -364,14 +364,14 @@ void LindstromTurkCore<ECM,K>::Add_shape_optimization_constraints( vertex_descri
for( typename vertex_descriptor_vector::const_iterator it = aLink.begin(), eit = aLink.end() ; it != eit ; ++it ) for( typename vertex_descriptor_vector::const_iterator it = aLink.begin(), eit = aLink.end() ; it != eit ; ++it )
c = c + (ORIGIN - get_point(*it)) ; c = c + (ORIGIN - get_point(*it)) ;
CGAL_ECMS_LT_TRACE(1," Adding shape optimization constraint. Shape vector: " << xyz_to_string(c) ); CGAL_SMS_LT_TRACE(1," Adding shape optimization constraint. Shape vector: " << xyz_to_string(c) );
Add_constraint_from_gradient(H,c); Add_constraint_from_gradient(H,c);
} }
template<class ECM, class K> template<class TM, class K>
typename LindstromTurkCore<ECM,K>::FT typename LindstromTurkCore<TM,K>::FT
LindstromTurkCore<ECM,K>::Compute_boundary_cost( Vector const& v, Boundary_data_vector const& aBdry ) LindstromTurkCore<TM,K>::Compute_boundary_cost( Vector const& v, Boundary_data_vector const& aBdry )
{ {
FT rCost(0); FT rCost(0);
for ( typename Boundary_data_vector::const_iterator it = aBdry.begin() ; it != aBdry.end() ; ++ it ) for ( typename Boundary_data_vector::const_iterator it = aBdry.begin() ; it != aBdry.end() ; ++ it )
@ -383,9 +383,9 @@ LindstromTurkCore<ECM,K>::Compute_boundary_cost( Vector const& v, Boundary_data_
return rCost / FT(4) ; return rCost / FT(4) ;
} }
template<class ECM, class K> template<class TM, class K>
typename LindstromTurkCore<ECM,K>::FT typename LindstromTurkCore<TM,K>::FT
LindstromTurkCore<ECM,K>::Compute_volume_cost( Vector const& v, Triangle_data_vector const& aTriangles ) LindstromTurkCore<TM,K>::Compute_volume_cost( Vector const& v, Triangle_data_vector const& aTriangles )
{ {
FT rCost(0); FT rCost(0);
@ -402,9 +402,9 @@ LindstromTurkCore<ECM,K>::Compute_volume_cost( Vector const& v, Triangle_data_ve
return rCost / FT(36) ; return rCost / FT(36) ;
} }
template<class ECM, class K> template<class TM, class K>
typename LindstromTurkCore<ECM,K>::FT typename LindstromTurkCore<TM,K>::FT
LindstromTurkCore<ECM,K>::Compute_shape_cost( Point const& p, vertex_descriptor_vector const& aLink ) LindstromTurkCore<TM,K>::Compute_shape_cost( Point const& p, vertex_descriptor_vector const& aLink )
{ {
FT rCost(0); FT rCost(0);
@ -414,27 +414,27 @@ LindstromTurkCore<ECM,K>::Compute_shape_cost( Point const& p, vertex_descriptor_
return rCost ; return rCost ;
} }
template<class ECM, class K> template<class TM, class K>
void LindstromTurkCore<ECM,K>::Add_constraint_if_alpha_compatible( Vector const& Ai, FT const& bi ) void LindstromTurkCore<TM,K>::Add_constraint_if_alpha_compatible( Vector const& Ai, FT const& bi )
{ {
CGAL_ECMS_LT_TRACE(3," Adding new constraints if alpha-compatible.\n Ai: " << xyz_to_string(Ai) << "\n bi:" << n_to_string(bi) << ")" ); CGAL_SMS_LT_TRACE(3," Adding new constraints if alpha-compatible.\n Ai: " << xyz_to_string(Ai) << "\n bi:" << n_to_string(bi) << ")" );
FT slai = Ai*Ai ; FT slai = Ai*Ai ;
CGAL_ECMS_LT_TRACE(3,"\n slai: " << n_to_string(slai) << ")" ); CGAL_SMS_LT_TRACE(3,"\n slai: " << n_to_string(slai) << ")" );
if ( is_finite(slai) ) if ( is_finite(slai) )
{ {
FT l = CGAL_NTS sqrt( slai ) ; FT l = CGAL_NTS sqrt( slai ) ;
CGAL_ECMS_LT_TRACE(3," l: " << n_to_string(l) ); CGAL_SMS_LT_TRACE(3," l: " << n_to_string(l) );
if ( !CGAL_NTS is_zero(l) ) if ( !CGAL_NTS is_zero(l) )
{ {
Vector Ain = Ai / l ; Vector Ain = Ai / l ;
FT bin = bi / l ; FT bin = bi / l ;
CGAL_ECMS_LT_TRACE(3," Ain: " << xyz_to_string(Ain) << " bin:" << n_to_string(bin) ); CGAL_SMS_LT_TRACE(3," Ain: " << xyz_to_string(Ain) << " bin:" << n_to_string(bin) );
bool lAddIt = true ; bool lAddIt = true ;
@ -447,7 +447,7 @@ void LindstromTurkCore<ECM,K>::Add_constraint_if_alpha_compatible( Vector const&
FT max = sla0 * slai * mSquared_cos_alpha ; FT max = sla0 * slai * mSquared_cos_alpha ;
CGAL_ECMS_LT_TRACE(3," Second constraint. d01: " << n_to_string(d01) << " sla0:" << n_to_string(sla0) << " sd01:" << n_to_string(sd01) << " max:" << n_to_string(max) ); CGAL_SMS_LT_TRACE(3," Second constraint. d01: " << n_to_string(d01) << " sla0:" << n_to_string(sla0) << " sd01:" << n_to_string(sd01) << " max:" << n_to_string(max) );
if ( sd01 > max ) if ( sd01 > max )
lAddIt = false ; lAddIt = false ;
@ -463,7 +463,7 @@ void LindstromTurkCore<ECM,K>::Add_constraint_if_alpha_compatible( Vector const&
FT min = slc01 * slai * mSquared_sin_alpha ; FT min = slc01 * slai * mSquared_sin_alpha ;
CGAL_ECMS_LT_TRACE(3," Third constraint. N: " << xyz_to_string(N) << " dc012:" << n_to_string(dc012) << " slc01:" << n_to_string(slc01) CGAL_SMS_LT_TRACE(3," Third constraint. N: " << xyz_to_string(N) << " dc012:" << n_to_string(dc012) << " slc01:" << n_to_string(slc01)
<< " sdc012:" << n_to_string(sdc012) << " min:" << n_to_string(min) ); << " sdc012:" << n_to_string(sdc012) << " min:" << n_to_string(min) );
if ( sdc012 <= min ) if ( sdc012 <= min )
@ -488,24 +488,24 @@ void LindstromTurkCore<ECM,K>::Add_constraint_if_alpha_compatible( Vector const&
break ; break ;
} }
CGAL_ECMS_LT_TRACE(3," Accepting # " << mConstraints_n << " A:" << matrix_to_string(mConstraints_A) << " b:" << xyz_to_string(mConstraints_b) ) ; CGAL_SMS_LT_TRACE(3," Accepting # " << mConstraints_n << " A:" << matrix_to_string(mConstraints_A) << " b:" << xyz_to_string(mConstraints_b) ) ;
++ mConstraints_n ; ++ mConstraints_n ;
} }
else else
{ {
CGAL_ECMS_LT_TRACE(3," INCOMPATIBLE. Discarded" ) ; CGAL_SMS_LT_TRACE(3," INCOMPATIBLE. Discarded" ) ;
} }
} }
else else
{ {
CGAL_ECMS_LT_TRACE(3," l is ZERO. Discarded" ); CGAL_SMS_LT_TRACE(3," l is ZERO. Discarded" );
} }
} }
else else
{ {
CGAL_ECMS_LT_TRACE(3," OVERFLOW. Discarded" ) ; CGAL_SMS_LT_TRACE(3," OVERFLOW. Discarded" ) ;
} }
} }
@ -531,10 +531,10 @@ int index_of_max_component ( V const& v )
return i ; return i ;
} }
template<class ECM, class K> template<class TM, class K>
void LindstromTurkCore<ECM,K>::Add_constraint_from_gradient ( Matrix const& H, Vector const& c ) void LindstromTurkCore<TM,K>::Add_constraint_from_gradient ( Matrix const& H, Vector const& c )
{ {
CGAL_ECMS_LT_TRACE(3," Adding constraint from gradient. Current n=" << mConstraints_n ) ; CGAL_SMS_LT_TRACE(3," Adding constraint from gradient. Current n=" << mConstraints_n ) ;
CGAL_precondition(mConstraints_n >= 0 && mConstraints_n<=2 ); CGAL_precondition(mConstraints_n >= 0 && mConstraints_n<=2 );
@ -571,7 +571,7 @@ void LindstromTurkCore<ECM,K>::Add_constraint_from_gradient ( Matrix const& H, V
default : Q0 = NULL_VECTOR ; // This should never happen! default : Q0 = NULL_VECTOR ; // This should never happen!
} }
CGAL_ECMS_LT_TRACE(3," Q0:" << xyz_to_string(Q0) ) ; CGAL_SMS_LT_TRACE(3," Q0:" << xyz_to_string(Q0) ) ;
CGAL_assertion( Q0 != NULL_VECTOR ) ; CGAL_assertion( Q0 != NULL_VECTOR ) ;
@ -583,7 +583,7 @@ void LindstromTurkCore<ECM,K>::Add_constraint_from_gradient ( Matrix const& H, V
FT b1 = - ( Q0 * c ) ; FT b1 = - ( Q0 * c ) ;
FT b2 = - ( Q1 * c ) ; FT b2 = - ( Q1 * c ) ;
CGAL_ECMS_LT_TRACE(3," Q1:" << xyz_to_string(Q1) << "\n A1: " << xyz_to_string(A1) << "\n A2:" << xyz_to_string(A2) CGAL_SMS_LT_TRACE(3," Q1:" << xyz_to_string(Q1) << "\n A1: " << xyz_to_string(A1) << "\n A2:" << xyz_to_string(A2)
<< "\n b1:" << n_to_string(b1) << "\n b2:" << n_to_string(b2) ) ; << "\n b1:" << n_to_string(b1) << "\n b2:" << n_to_string(b2) ) ;
Add_constraint_if_alpha_compatible(A1,b1); Add_constraint_if_alpha_compatible(A1,b1);
@ -601,7 +601,7 @@ void LindstromTurkCore<ECM,K>::Add_constraint_from_gradient ( Matrix const& H, V
FT b2 = - ( Q * c ) ; FT b2 = - ( Q * c ) ;
CGAL_ECMS_LT_TRACE(3," Q:" << xyz_to_string(Q) << "\n A2: " << xyz_to_string(A2) << "\n b2:" << n_to_string(b2) ) ; CGAL_SMS_LT_TRACE(3," Q:" << xyz_to_string(Q) << "\n A2: " << xyz_to_string(A2) << "\n b2:" << n_to_string(b2) ) ;
Add_constraint_if_alpha_compatible(A2,b2); Add_constraint_if_alpha_compatible(A2,b2);

View File

@ -34,14 +34,14 @@ namespace Surface_mesh_simplification
// //
// Edge-length cost: the squared length of the collapsing edge // Edge-length cost: the squared length of the collapsing edge
// //
template<class ECM> template<class TM>
class Edge_length_cost class Edge_length_cost
{ {
public: public:
/* /*
typedef ECM_ ECM ; typedef TM_ TM ;
typedef Edge_profile<ECM> Profile ; typedef Edge_profile<TM> Profile ;
typedef typename Profile::Point Point; typedef typename Profile::Point Point;
typedef typename Kernel_traits<Point>::Kernel Kernel ; typedef typename Kernel_traits<Point>::Kernel Kernel ;
typedef typename Kernel::FT FT ; typedef typename Kernel::FT FT ;

View File

@ -33,21 +33,21 @@ namespace CGAL {
namespace Surface_mesh_simplification namespace Surface_mesh_simplification
{ {
template<class ECM_, class VertexPointMap_ = typename boost::property_map<ECM_, CGAL::vertex_point_t>::type> template<class TM_, class VertexPointMap_ = typename boost::property_map<TM_, CGAL::vertex_point_t>::type>
class Edge_profile class Edge_profile
{ {
public: public:
typedef ECM_ ECM ; typedef TM_ TM ;
typedef VertexPointMap_ VertexPointMap; typedef VertexPointMap_ VertexPointMap;
typedef boost::graph_traits<ECM> GraphTraits ; typedef boost::graph_traits<TM> GraphTraits ;
typedef typename GraphTraits::vertex_descriptor vertex_descriptor ; typedef typename GraphTraits::vertex_descriptor vertex_descriptor ;
typedef typename GraphTraits::face_descriptor face_descriptor ; typedef typename GraphTraits::face_descriptor face_descriptor ;
typedef typename GraphTraits::halfedge_descriptor halfedge_descriptor ; typedef typename GraphTraits::halfedge_descriptor halfedge_descriptor ;
//typedef typename boost::property_map<ECM, CGAL::vertex_point_t>::type Vertex_point_pmap; //typedef typename boost::property_map<TM, CGAL::vertex_point_t>::type Vertex_point_pmap;
typedef typename boost::property_traits<VertexPointMap>::value_type Point; typedef typename boost::property_traits<VertexPointMap>::value_type Point;
typedef typename Kernel_traits<Point>::Kernel Kernel; typedef typename Kernel_traits<Point>::Kernel Kernel;
typedef typename Kernel::FT FT; typedef typename Kernel::FT FT;
@ -84,7 +84,7 @@ public :
,class EdgeIdxMap ,class EdgeIdxMap
> >
Edge_profile ( halfedge_descriptor const& aV0V1 Edge_profile ( halfedge_descriptor const& aV0V1
, ECM& aSurface , TM& aSurface
, VertexIdxMap const& aVertex_index_map , VertexIdxMap const& aVertex_index_map
, VertexPointMap const& aVertex_point_map , VertexPointMap const& aVertex_point_map
, EdgeIdxMap const& aEdge_index_map , EdgeIdxMap const& aEdge_index_map
@ -129,8 +129,8 @@ public :
halfedge_descriptor_vector const& border_edges() const { halfedge_descriptor_vector const& border_edges() const {
return mBorderEdges ; return mBorderEdges ;
} }
ECM& surface() const { return *mSurface ; } TM& surface() const { return *mSurface ; }
ECM& surface_mesh() const { return *mSurface ; } TM& surface_mesh() const { return *mSurface ; }
VertexPointMap vertex_point_map() const { return mvpm ; } VertexPointMap vertex_point_map() const { return mvpm ; }
@ -151,7 +151,7 @@ private:
bool is_border(halfedge_descriptor e) const bool is_border(halfedge_descriptor e) const
{ {
return face(e,*mSurface) == boost::graph_traits<ECM>::null_face(); return face(e,*mSurface) == boost::graph_traits<TM>::null_face();
} }
@ -185,7 +185,7 @@ private:
halfedge_descriptor_vector mBorderEdges ; halfedge_descriptor_vector mBorderEdges ;
Triangle_vector mTriangles ; Triangle_vector mTriangles ;
ECM* mSurface ; TM* mSurface ;
VertexPointMap mvpm; VertexPointMap mvpm;
} ; } ;

View File

@ -28,13 +28,13 @@ namespace CGAL {
namespace Surface_mesh_simplification namespace Surface_mesh_simplification
{ {
template<class ECM, class VertexPointMap> template<class TM, class VertexPointMap>
template<class VertexIdxMap template<class VertexIdxMap
,class EdgeIdxMap ,class EdgeIdxMap
> >
Edge_profile<ECM,VertexPointMap>::Edge_profile ( halfedge_descriptor const& aV0V1 Edge_profile<TM,VertexPointMap>::Edge_profile ( halfedge_descriptor const& aV0V1
, ECM& aSurface , TM& aSurface
, VertexIdxMap const& , VertexIdxMap const&
, VertexPointMap const& aVertex_point_map , VertexPointMap const& aVertex_point_map
, EdgeIdxMap const& , EdgeIdxMap const&
@ -102,8 +102,8 @@ template<class VertexIdxMap
} }
template<class ECM, class VertexPointMap> template<class TM, class VertexPointMap>
void Edge_profile<ECM,VertexPointMap>::Extract_borders() void Edge_profile<TM,VertexPointMap>::Extract_borders()
{ {
halfedge_descriptor e = mV0V1; halfedge_descriptor e = mV0V1;
halfedge_descriptor oe = opposite(e, surface_mesh()); halfedge_descriptor oe = opposite(e, surface_mesh());
@ -135,8 +135,8 @@ template<class VertexIdxMap
// Extract all triangles (its normals) and vertices (the link) around the collapsing edge p_q // Extract all triangles (its normals) and vertices (the link) around the collapsing edge p_q
// //
template<class ECM, class VertexPointMap> template<class TM, class VertexPointMap>
void Edge_profile<ECM,VertexPointMap>::Extract_triangles_and_link() void Edge_profile<TM,VertexPointMap>::Extract_triangles_and_link()
{ {
#ifdef CGAL_SMS_EDGE_PROFILE_ALWAYS_NEED_UNIQUE_VERTEX_IN_LINK #ifdef CGAL_SMS_EDGE_PROFILE_ALWAYS_NEED_UNIQUE_VERTEX_IN_LINK
std::set<vertex_descriptor> vertex_already_inserted; std::set<vertex_descriptor> vertex_already_inserted;

View File

@ -31,15 +31,15 @@ namespace CGAL {
namespace Surface_mesh_simplification namespace Surface_mesh_simplification
{ {
template<class ECM_> template<class TM_>
class LindstromTurk_cost class LindstromTurk_cost
{ {
public: public:
typedef ECM_ ECM ; typedef TM_ TM ;
/* /*
typedef Edge_profile<ECM> Profile ; typedef Edge_profile<TM> Profile ;
typedef typename Traits::Point_3 Point; typedef typename Traits::Point_3 Point;
typedef typename Traits::FT FT ; typedef typename Traits::FT FT ;
@ -53,7 +53,7 @@ public:
optional<typename Profile::FT> optional<typename Profile::FT>
operator()( Profile const& aProfile, optional<typename Profile::Point> const& aPlacement ) const operator()( Profile const& aProfile, optional<typename Profile::Point> const& aPlacement ) const
{ {
return LindstromTurkCore<ECM,Profile>(mParams,aProfile).compute_cost(aPlacement) ; return LindstromTurkCore<TM,Profile>(mParams,aProfile).compute_cost(aPlacement) ;
} }
private: private:

View File

@ -31,12 +31,12 @@ namespace CGAL {
namespace Surface_mesh_simplification namespace Surface_mesh_simplification
{ {
template<class ECM_> template<class TM_>
class LindstromTurk_placement class LindstromTurk_placement
{ {
public: public:
typedef ECM_ ECM ; typedef TM_ TM ;
public: public:
@ -46,7 +46,7 @@ public:
optional<typename Profile::Point> optional<typename Profile::Point>
operator()( Profile const& aProfile) const operator()( Profile const& aProfile) const
{ {
return LindstromTurkCore<ECM,Profile>(mParams,aProfile).compute_placement() ; return LindstromTurkCore<TM,Profile>(mParams,aProfile).compute_placement() ;
} }
private: private:

View File

@ -31,12 +31,12 @@ namespace CGAL {
namespace Surface_mesh_simplification namespace Surface_mesh_simplification
{ {
template<class ECM_> template<class TM_>
class Midpoint_placement class Midpoint_placement
{ {
public: public:
typedef ECM_ ECM; typedef TM_ TM;
Midpoint_placement() Midpoint_placement()
{} {}

View File

@ -35,7 +35,7 @@ namespace CGAL {
namespace Surface_mesh_simplification namespace Surface_mesh_simplification
{ {
template<class ECM template<class TM
,class ShouldStop ,class ShouldStop
,class VertexIndexMap ,class VertexIndexMap
,class VertexPointMap ,class VertexPointMap
@ -45,13 +45,13 @@ template<class ECM
,class GetPlacement ,class GetPlacement
,class Visitor ,class Visitor
> >
int edge_collapse ( ECM& aSurface int edge_collapse ( TM& aSurface
, ShouldStop const& aShould_stop , ShouldStop const& aShould_stop
// optional mesh information policies // optional mesh information policies
, VertexIndexMap const& aVertex_index_map // defaults to get(vertex_index,aSurface) , VertexIndexMap const& aVertex_index_map // defaults to get(vertex_index,aSurface)
, VertexPointMap const& aVertex_point_map // defaults to get(vertex_point,aSurface) , VertexPointMap const& aVertex_point_map // defaults to get(vertex_point,aSurface)
, EdgeIndexMap const& aEdge_index_map // defaults to get(edge_index,aSurface) , EdgeIndexMap const& aEdge_index_map // defaults to get(edge_index,aSurface)
, EdgeIsConstrainedMap const& aEdge_is_constrained_map // defaults to No_constrained_edge_map<ECM>() , EdgeIsConstrainedMap const& aEdge_is_constrained_map // defaults to No_constrained_edge_map<TM>()
// optional strategy policies - defaults to LindstomTurk // optional strategy policies - defaults to LindstomTurk
, GetCost const& aGet_cost , GetCost const& aGet_cost
@ -60,7 +60,7 @@ int edge_collapse ( ECM& aSurface
, Visitor aVisitor , Visitor aVisitor
) )
{ {
typedef EdgeCollapse< ECM typedef EdgeCollapse< TM
, ShouldStop , ShouldStop
, VertexIndexMap , VertexIndexMap
, VertexPointMap , VertexPointMap
@ -89,8 +89,8 @@ int edge_collapse ( ECM& aSurface
struct Dummy_visitor struct Dummy_visitor
{ {
template<class ECM> void OnStarted( ECM& ) const {} template<class TM> void OnStarted( TM& ) const {}
template<class ECM> void OnFinished ( ECM& ) const {} template<class TM> void OnFinished ( TM& ) const {}
template<class Profile> void OnStopConditionReached( Profile const& ) const {} template<class Profile> void OnStopConditionReached( Profile const& ) const {}
template<class Profile, class OFT> void OnCollected( Profile const&, OFT const& ) const {} template<class Profile, class OFT> void OnCollected( Profile const&, OFT const& ) const {}
template<class Profile, class OFT, class Size_type> void OnSelected( Profile const&, OFT const&, Size_type, Size_type ) const {} template<class Profile, class OFT, class Size_type> void OnSelected( Profile const&, OFT const&, Size_type, Size_type ) const {}
@ -99,8 +99,8 @@ struct Dummy_visitor
template<class Profile> void OnNonCollapsable(Profile const& ) const {} template<class Profile> void OnNonCollapsable(Profile const& ) const {}
} ; } ;
template<class ECM, class ShouldStop, class P, class T, class R> template<class TM, class ShouldStop, class P, class T, class R>
int edge_collapse ( ECM& aSurface int edge_collapse ( TM& aSurface
, ShouldStop const& aShould_stop , ShouldStop const& aShould_stop
, cgal_bgl_named_params<P,T,R> const& aParams , cgal_bgl_named_params<P,T,R> const& aParams
) )
@ -118,15 +118,15 @@ int edge_collapse ( ECM& aSurface
,choose_const_pmap(get_param(aParams,internal_np::vertex_index),aSurface,boost::vertex_index) ,choose_const_pmap(get_param(aParams,internal_np::vertex_index),aSurface,boost::vertex_index)
,choose_pmap(get_param(aParams,internal_np::vertex_point),aSurface,boost::vertex_point) ,choose_pmap(get_param(aParams,internal_np::vertex_point),aSurface,boost::vertex_point)
,choose_const_pmap(get_param(aParams,internal_np::halfedge_index),aSurface,boost::halfedge_index) ,choose_const_pmap(get_param(aParams,internal_np::halfedge_index),aSurface,boost::halfedge_index)
,choose_param (get_param(aParams,internal_np::edge_is_constrained),No_constrained_edge_map<ECM>()) ,choose_param (get_param(aParams,internal_np::edge_is_constrained),No_constrained_edge_map<TM>())
,choose_param (get_param(aParams,internal_np::get_cost_policy), LindstromTurk_cost<ECM>()) ,choose_param (get_param(aParams,internal_np::get_cost_policy), LindstromTurk_cost<TM>())
,choose_param (get_param(aParams,internal_np::get_placement_policy), LindstromTurk_placement<ECM>()) ,choose_param (get_param(aParams,internal_np::get_placement_policy), LindstromTurk_placement<TM>())
,choose_param (get_param(aParams,vis), Dummy_visitor()) ,choose_param (get_param(aParams,vis), Dummy_visitor())
); );
} }
template<class ECM, class ShouldStop, class GT, class P, class T, class R> template<class TM, class ShouldStop, class GT, class P, class T, class R>
int edge_collapse ( ECM& aSurface int edge_collapse ( TM& aSurface
, ShouldStop const& aShould_stop , ShouldStop const& aShould_stop
, cgal_bgl_named_params<P,T,R> const& aParams , cgal_bgl_named_params<P,T,R> const& aParams
) )
@ -144,22 +144,22 @@ int edge_collapse ( ECM& aSurface
,choose_const_pmap(get_param(aParams,internal_np::vertex_index),aSurface,boost::vertex_index) ,choose_const_pmap(get_param(aParams,internal_np::vertex_index),aSurface,boost::vertex_index)
,choose_const_pmap(get_param(aParams,internal_np::vertex_point),aSurface,boost::vertex_point) ,choose_const_pmap(get_param(aParams,internal_np::vertex_point),aSurface,boost::vertex_point)
,choose_const_pmap(get_param(aParams,internal_np::halfedge_index),aSurface,boost::halfedge_index) ,choose_const_pmap(get_param(aParams,internal_np::halfedge_index),aSurface,boost::halfedge_index)
,choose_param (get_param(aParams,internal_np::edge_is_constrained),No_constrained_edge_map<ECM>()) ,choose_param (get_param(aParams,internal_np::edge_is_constrained),No_constrained_edge_map<TM>())
,choose_param (get_param(aParams,internal_np::get_cost_policy), LindstromTurk_cost<ECM>()) ,choose_param (get_param(aParams,internal_np::get_cost_policy), LindstromTurk_cost<TM>())
,choose_param (get_param(aParams,internal_np::get_placement_policy), LindstromTurk_placement<ECM>()) ,choose_param (get_param(aParams,internal_np::get_placement_policy), LindstromTurk_placement<TM>())
,choose_param (get_param(aParams,vis), Dummy_visitor()) ,choose_param (get_param(aParams,vis), Dummy_visitor())
); );
} }
template<class ECM, class ShouldStop> template<class TM, class ShouldStop>
int edge_collapse ( ECM& aSurface, ShouldStop const& aShould_stop ) int edge_collapse ( TM& aSurface, ShouldStop const& aShould_stop )
{ {
return edge_collapse(aSurface,aShould_stop, CGAL::parameters::halfedge_index_map(get(boost::halfedge_index,aSurface))); return edge_collapse(aSurface,aShould_stop, CGAL::parameters::halfedge_index_map(get(boost::halfedge_index,aSurface)));
} }
template<class ECM, class ShouldStop, class GT> template<class TM, class ShouldStop, class GT>
int edge_collapse ( ECM& aSurface, ShouldStop const& aShould_stop) int edge_collapse ( TM& aSurface, ShouldStop const& aShould_stop)
{ {
return edge_collapse(aSurface,aShould_stop, CGAL::parameters::halfedge_index_map(get(boost::halfedge_index,aSurface))); return edge_collapse(aSurface,aShould_stop, CGAL::parameters::halfedge_index_map(get(boost::halfedge_index,aSurface)));
} }

View File

@ -123,31 +123,31 @@ public:
// Constructs a flat polyhedron containing just the link of a vertex // Constructs a flat polyhedron containing just the link of a vertex
class Vertex_link_builder : public Link_builder class Vertex_link_builder : public Link_builder
{ {
Surface* mECM ; Surface* m_tm ;
Vertex_handle mV ; Vertex_handle mV ;
Surface& ecm() { return *mECM ; } Surface& tm() { return *m_tm ; }
public: public:
Vertex_link_builder( Surface& aECM, Vertex_handle aV) : mECM(&aECM), mV(aV) {} Vertex_link_builder( Surface& aTM, Vertex_handle aV) : m_tm(&aTM), mV(aV) {}
void operator()( Surface::HalfedgeDS& hds ) void operator()( Surface::HalfedgeDS& hds )
{ {
Builder B( hds, true); Builder B( hds, true);
B.begin_surface( 1 + out_degree(mV,ecm()), out_degree(mV,ecm()) ); B.begin_surface( 1 + out_degree(mV,tm()), out_degree(mV,tm()) );
this->add_vertex(B,mV); this->add_vertex(B,mV);
Profile::Triangle_vector triangles ; Profile::Triangle_vector triangles ;
out_edge_iterator eb, ee ; out_edge_iterator eb, ee ;
for ( boost::tie(eb,ee) = halfedges_around_source(opposite(halfedge(mV,ecm()),ecm()),ecm()) ; eb != ee ; ++ eb ) for ( boost::tie(eb,ee) = halfedges_around_source(opposite(halfedge(mV,tm()),tm()),tm()) ; eb != ee ; ++ eb )
{ {
halfedge_descriptor out_edge1 = *eb ; halfedge_descriptor out_edge1 = *eb ;
halfedge_descriptor out_edge2 = out_edge1->opposite()->next(); halfedge_descriptor out_edge2 = out_edge1->opposite()->next();
vertex_descriptor v1 = target(out_edge1,ecm()); vertex_descriptor v1 = target(out_edge1,tm());
vertex_descriptor v2 = target(out_edge2,ecm()); vertex_descriptor v2 = target(out_edge2,tm());
this->add_vertex(B,v1); this->add_vertex(B,v1);
@ -289,8 +289,8 @@ public :
Visitor( string aTestCase ) : mTestCase(aTestCase) Visitor( string aTestCase ) : mTestCase(aTestCase)
{ {
#ifdef CGAL_ECMS_TRACE_IMPL #ifdef CGAL_SMS_TRACE_IMPL
::internal::cgal_enable_ecms_trace = true ; ::internal::cgal_enable_sms_trace = true ;
#endif #endif
mStep = 0 ; mStep = 0 ;
} }