a48
2.0.2
|
00001 00008 #ifndef A48_HALFEDGET_HH 00009 #define A48_HALFEDGET_HH 00010 00011 //== INCLUDES ================================================================= 00012 00013 #include <algorithm> 00014 00015 //== NAMESPACES =============================================================== 00016 00017 namespace a48 { 00018 00019 //== CLASS DEFINITION ========================================================= 00020 00026 template< class Traits > 00027 class HalfedgeT { 00028 00029 public: 00030 00031 typedef typename Traits::vertex_type vertex_type; 00032 typedef typename Traits::halfedge_type halfedge_type; 00033 typedef typename Traits::face_type face_type; 00034 00035 typedef typename std::pair< const vertex_type*, const vertex_type* > edge_type; 00036 00038 HalfedgeT() : v(0), n(0), o(0), f(0) { } 00039 00046 HalfedgeT( vertex_type *_v, 00047 halfedge_type *_n = 0, 00048 halfedge_type *_o = 0, 00049 face_type *_f = 0 ) : v(_v), n(_n), o(_o), f(_f) { } 00050 00054 bool is_boundary( void ) const { return (o == 0); } 00055 00059 bool is_consistent( void ) const { return (o == 0) or (o->vertex() != v); } 00060 00061 // @name Get functions 00063 00067 const vertex_type* from_vertex( void ) const { return previous()->vertex(); } 00071 vertex_type* from_vertex( void ) { return previous()->vertex(); } 00072 00076 const vertex_type* vertex( void ) const { return v; } 00080 vertex_type* vertex( void ) { return v; } 00081 00085 const halfedge_type* next( void ) const { return n; } 00089 halfedge_type* next( void ) { return n; } 00090 00094 const halfedge_type* previous( void ) const { 00095 const halfedge_type *_h = n->next(); 00096 while( _h->next() != this ) { _h = _h->next(); } 00097 return _h; 00098 } 00102 halfedge_type* previous( void ) { 00103 halfedge_type *_h = n->next(); 00104 while( _h->next() != this ) { _h = _h->next(); } 00105 return _h; 00106 } 00107 00111 const halfedge_type* opposite( void ) const { return o; } 00115 halfedge_type* opposite( void ) { return o; } 00116 00120 const face_type* face( void ) const { return f; } 00124 face_type* face( void ) { return f; } 00125 00129 unsigned int adjacent_faces( void ) const { return this->is_boundary() ? 1 : 2; } 00130 00134 edge_type edge( void ) const { 00135 edge_type e; 00136 this->edge(e); 00137 return e; 00138 } 00146 void edge( edge_type& e ) const { 00147 const vertex_type *v0 = this->from_vertex(); 00148 const vertex_type *v1 = this->vertex(); 00149 if( v0 < v1 ) e = std::make_pair( v0, v1 ); 00150 else e = std::make_pair( v1, v0 ); 00151 } 00152 00156 bool is_flip_ok( void ) const { 00157 const vertex_type *v0 = this->from_vertex(); // Verify left-side closed loop 00158 const vertex_type *v1 = this->vertex(); // Verify right-side closed loop 00159 return ( v0->is_flip_ok() ) and ( v1->is_flip_ok() ); 00160 } 00161 00163 00164 // @name Set functions 00166 00170 void set_vertex( vertex_type *_v ) { v = _v; } 00171 00175 void set_next( halfedge_type *_n ) { n = _n; } 00176 00180 void set_opposite( halfedge_type *_o ) { o = _o; } 00181 00185 void set_face( face_type *_f ) { f = _f; } 00186 00192 void set( vertex_type *_v, halfedge_type *_n, halfedge_type *_o ) { v = _v; n = _n; o = _o; } 00198 void set( vertex_type *_v, halfedge_type *_n, face_type *_f ) { v = _v; n = _n; f = _f; } 00203 void set( vertex_type *_v, halfedge_type *_n ) { v = _v; n = _n; } 00208 void set( halfedge_type *_n, face_type *_f ) { n = _n; f = _f; } 00214 void set( halfedge_type *_n, face_type *_f, halfedge_type *_o ) { n = _n; f = _f; o = _o; } 00219 void set( face_type *_f, halfedge_type *_o ) { f = _f; o = _o; } 00226 void set( vertex_type *_v, halfedge_type *_n, 00227 halfedge_type *_o, face_type *_f ) { v = _v; n = _n; o = _o; f = _f; } 00228 00230 00231 private: 00232 00233 vertex_type *v; 00234 halfedge_type *n; 00235 halfedge_type *o; 00236 face_type *f; 00237 00238 }; 00239 00240 //== CLASS DEFINITION ========================================================= 00241 00247 template< class Traits > 00248 class AdaptiveHalfedgeT : public HalfedgeT< Traits > { 00249 00250 public: 00251 00252 typedef typename Traits::vertex_type vertex_type; 00253 typedef typename Traits::halfedge_type halfedge_type; 00254 typedef typename Traits::face_type face_type; 00255 00257 AdaptiveHalfedgeT() : HalfedgeT< Traits >() { } 00258 00265 AdaptiveHalfedgeT( vertex_type *_v, 00266 halfedge_type *_n = 0, 00267 halfedge_type *_o = 0, 00268 face_type *_f = 0 ) : HalfedgeT< Traits >(_v,_n,_o,_f) { } 00269 00270 // @name Get functions 00272 00280 bool is_split( void ) const { return this->face()->split_halfedge() == this; } 00281 00285 unsigned int level( void ) const { 00286 return std::max( this->vertex()->level(), 00287 this->from_vertex()->level() ); 00288 } 00289 00291 00292 }; 00293 00294 //============================================================================= 00295 } // namespace a48 00296 //============================================================================= 00297 #endif // A48_HALFEDGET_HH 00298 //=============================================================================