a48  2.0.2
include/halfedget.hh
Go to the documentation of this file.
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 //=============================================================================
 All Classes Namespaces Files Functions Typedefs