iterators.h

Go to the documentation of this file.
00001 
00009 #ifndef  _ITERATORS_H_
00010 #define  _ITERATORS_H_
00011 
00012 #include "BaseMesh.h"
00013 
00014 namespace MeshLib{
00015 
00016 
00017 //v->out halfedge
00021 template<typename CVertex, typename CEdge, typename CFace, typename CHalfEdge>
00022 class VertexOutHalfedgeIterator
00023 {
00024 public:
00030         VertexOutHalfedgeIterator( CBaseMesh<CVertex, CEdge, CFace, CHalfEdge> *  pMesh, CVertex *  v )
00031         { m_pMesh = pMesh; m_vertex = v; m_halfedge = m_pMesh->vertexMostClwOutHalfEdge(v); };
00032 
00036         ~VertexOutHalfedgeIterator(){};
00040         void operator++() //prefix
00041         {assert( m_halfedge != NULL ); 
00042          if( m_halfedge == m_pMesh->vertexMostCcwOutHalfEdge(m_vertex) ) 
00043                  m_halfedge = NULL;
00044          else
00045                  m_halfedge = m_pMesh->vertexNextCcwOutHalfEdge(m_halfedge); };
00046 
00050         void operator++(int) //postfix
00051         {assert( m_halfedge != NULL ); 
00052          if( m_halfedge == m_pMesh->vertexMostCcwOutHalfEdge(m_vertex) ) 
00053                  m_halfedge = NULL;
00054          else
00055                  m_halfedge = m_pMesh->vertexNextCcwOutHalfEdge(m_halfedge); };
00056 
00061          CHalfEdge * value() { return m_halfedge; };
00065          bool end(){ return m_halfedge == NULL; };
00069          CHalfEdge * operator*() { return value(); };
00070 
00071 private:
00075         CBaseMesh<CVertex,CEdge,CFace,CHalfEdge> *        m_pMesh;
00079         CVertex *      m_vertex;
00083         CHalfEdge * m_halfedge;
00084 };
00085 
00086 //v->in halfedge
00090 template<typename CVertex, typename CEdge, typename CFace, typename CHalfEdge>
00091 class VertexInHalfedgeIterator
00092 {
00093 public:
00099         VertexInHalfedgeIterator(CBaseMesh<CVertex, CEdge, CFace, CHalfEdge> *  pMesh, CVertex * v )
00100         { m_pMesh = pMesh; m_vertex = v; m_halfedge = m_pMesh->vertexMostClwInHalfEdge(v); };
00104         ~VertexInHalfedgeIterator(){};
00105 
00109                 void operator++()       //prefix
00110         {
00111          assert( m_halfedge != NULL ); 
00112          if( m_halfedge == m_pMesh->vertexMostCcwInHalfEdge(m_vertex) ) 
00113                  m_halfedge = NULL; 
00114          else
00115                 m_halfedge = m_pMesh->vertexNextCcwInHalfEdge(m_halfedge); 
00116         };
00121         void operator++(int)    //postfix
00122         {
00123          assert( m_halfedge != NULL ); 
00124          if( m_halfedge == m_pMesh->vertexMostCcwInHalfEdge(m_vertex) ) 
00125                  m_halfedge = NULL; 
00126          else
00127                 m_halfedge = m_pMesh->vertexNextCcwInHalfEdge(m_halfedge); 
00128         };
00133         CHalfEdge * value() { return m_halfedge; };
00137          bool end(){ return m_halfedge == NULL; };
00141          CHalfEdge * operator*() { return value(); };
00142 
00143 private:
00147         CBaseMesh<CVertex, CEdge, CFace, CHalfEdge> *        m_pMesh;
00151         CVertex *      m_vertex;
00155         CHalfEdge * m_halfedge;
00156 };
00157 
00158 
00159 //v -> v
00160 
00164 template<typename CVertex, typename CEdge, typename CFace, typename CHalfEdge>
00165 class VertexVertexIterator
00166 {
00167 public:
00172         VertexVertexIterator( CVertex *  v )
00173         { 
00174                 m_vertex = v; 
00175                 m_halfedge = (CHalfEdge*)m_vertex->most_clw_out_halfedge();
00176         };
00177 
00181         ~VertexVertexIterator(){};
00182 
00187         void operator++() //prefix
00188         {
00189                 assert( m_halfedge != NULL ); 
00190                 
00191                 if( !m_vertex->boundary() )
00192                 {
00193                         if( m_halfedge != m_vertex->most_ccw_out_halfedge() )
00194                         {
00195                                 m_halfedge = (CHalfEdge*)m_halfedge->ccw_rotate_about_source();
00196                         }
00197                         else
00198                         {
00199                                 m_halfedge = NULL;
00200                         }
00201                         return;
00202                 }
00203 
00204                 if( m_vertex->boundary() )
00205                 {
00206                         if( m_halfedge == (CHalfEdge*)m_vertex->most_ccw_in_halfedge() )
00207                         {
00208                                 m_halfedge = NULL;
00209                                 return;
00210                         }
00211 
00212                         CHalfEdge * he = (CHalfEdge*)m_halfedge->ccw_rotate_about_source();
00213 
00214                         if( he == NULL )
00215                         {
00216                                 m_halfedge = (CHalfEdge*)m_vertex->most_ccw_in_halfedge();
00217                         }
00218                         else
00219                         {
00220                                 m_halfedge = he;
00221                         }
00222                 }
00223 
00224                 return;
00225         };
00226 
00227 
00231         void operator++(int) //postfix
00232         {
00233                 assert( m_halfedge != NULL ); 
00234                 
00235                 if( !m_vertex->boundary() )
00236                 {
00237                         if( m_halfedge != (CHalfEdge*)m_vertex->most_ccw_out_halfedge() )
00238                         {
00239                                 m_halfedge = (CHalfEdge*)m_halfedge->ccw_rotate_about_source();
00240                         }
00241                         else
00242                         {
00243                                 m_halfedge = NULL;
00244                         }
00245                         return;
00246                 }
00247 
00248                 if( m_vertex->boundary() )
00249                 {
00250                         if( m_halfedge == (CHalfEdge*)m_vertex->most_ccw_in_halfedge() )
00251                         {
00252                                 m_halfedge = NULL;
00253                                 return;
00254                         }
00255 
00256                         CHalfEdge * he = (CHalfEdge*)m_halfedge->ccw_rotate_about_source();
00257 
00258                         if( he == NULL )
00259                         {
00260                                 m_halfedge = (CHalfEdge*)m_vertex->most_ccw_in_halfedge();
00261                         }
00262                         else
00263                         {
00264                                 m_halfedge = he;
00265                         }
00266                 }
00267 
00268                 return;
00269         };
00270 
00275          CVertex * value() 
00276          { 
00277                  if( !m_vertex->boundary() )
00278                  {
00279                          return (CVertex*)m_halfedge->target(); 
00280                  }
00281 
00282                  if( m_halfedge != (CHalfEdge*)m_vertex->most_ccw_in_halfedge() )
00283                  {
00284                          return (CVertex*)m_halfedge->target();
00285                  }
00286 
00287                  if( m_halfedge == (CHalfEdge*)m_vertex->most_ccw_in_halfedge() )
00288                  {
00289                          return (CVertex*)m_halfedge->source();
00290                  }
00291                  return NULL;
00292          };
00293 
00297          CVertex * operator*() { return value(); };
00298 
00302          bool end(){ return m_halfedge == NULL; };
00303 
00307          void reset()   { m_halfedge = (CHalfEdge*)m_vertex->most_clw_out_halfedge(); };
00308 
00309 private:
00313         CVertex *   m_vertex;
00317         CHalfEdge * m_halfedge;
00318 };
00319 
00320 
00321 //v -> edge
00326 template<typename CVertex, typename CEdge, typename CFace, typename CHalfEdge>
00327 class VertexEdgeIterator
00328 {
00329 public:
00334         VertexEdgeIterator( CVertex *  v )
00335         { 
00336                 m_vertex = v; 
00337                 m_halfedge = (CHalfEdge*)m_vertex->most_clw_out_halfedge();
00338         };
00339 
00343         ~VertexEdgeIterator(){};
00348         void operator++() //prefix
00349         {
00350                 assert( m_halfedge != NULL ); 
00351                 
00352                 if( !m_vertex->boundary() )
00353                 {
00354                         if( m_halfedge != (CHalfEdge*)m_vertex->most_ccw_out_halfedge() )
00355                         {
00356                                 m_halfedge = (CHalfEdge*)m_halfedge->ccw_rotate_about_source();
00357                         }
00358                         else
00359                         {
00360                                 m_halfedge = NULL;
00361                         }
00362                         return;
00363                 }
00364 
00365                 if( m_vertex->boundary() )
00366                 {
00367                         if( m_halfedge == (CHalfEdge*)m_vertex->most_ccw_in_halfedge() )
00368                         {
00369                                 m_halfedge = NULL;
00370                                 return;
00371                         }
00372 
00373                         CHalfEdge * he = (CHalfEdge*)m_halfedge->ccw_rotate_about_source();
00374 
00375                         if( he == NULL )
00376                         {
00377                                 m_halfedge = (CHalfEdge*)m_vertex->most_ccw_in_halfedge();
00378                         }
00379                         else
00380                         {
00381                                 m_halfedge = he;
00382                         }
00383                 }
00384 
00385                 return;
00386         };
00390         void operator++(int) //postfix
00391         {
00392                 assert( m_halfedge != NULL ); 
00393                 
00394                 if( !m_vertex->boundary() )
00395                 {
00396                         if( m_halfedge != (CHalfEdge*)m_vertex->most_ccw_out_halfedge() )
00397                         {
00398                                 m_halfedge = (CHalfEdge*)m_halfedge->ccw_rotate_about_source();
00399                         }
00400                         else
00401                         {
00402                                 m_halfedge = NULL;
00403                         }
00404                         return;
00405                 }
00406 
00407                 if( m_vertex->boundary() )
00408                 {
00409                         if( m_halfedge == (CHalfEdge*)m_vertex->most_ccw_in_halfedge() )
00410                         {
00411                                 m_halfedge = NULL;
00412                                 return;
00413                         }
00414 
00415                         CHalfEdge * he = (CHalfEdge*)m_halfedge->ccw_rotate_about_source();
00416 
00417                         if( he == NULL )
00418                         {
00419                                 m_halfedge = (CHalfEdge*)m_vertex->most_ccw_in_halfedge();
00420                         }
00421                         else
00422                         {
00423                                 m_halfedge = he;
00424                         }
00425                 }
00426 
00427                 return;
00428         };
00433          CEdge * value() 
00434          { 
00435                  assert( m_halfedge != NULL );
00436                  return (CEdge*)m_halfedge->edge();
00437          };
00438 
00442          CEdge * operator*() { return value(); };
00446          bool end(){ return m_halfedge == NULL; };
00450          void reset()   { m_halfedge = (CHalfEdge*)m_vertex->most_clw_out_halfedge(); };
00451 
00452 private:
00455         CVertex *   m_vertex;
00458         CHalfEdge * m_halfedge;
00459 };
00460 
00461 
00462 
00463 // v->face
00467 template<typename CVertex, typename CEdge, typename CFace, typename CHalfEdge>
00468 class VertexFaceIterator
00469 {
00470 public:
00475         VertexFaceIterator( CVertex * & v )
00476         { 
00477                 m_vertex = v; 
00478                 m_halfedge = (CHalfEdge*)m_vertex->most_clw_out_halfedge(); 
00479         };
00483         ~VertexFaceIterator(){};
00487         void operator++() //prefix
00488         {
00489                 assert( m_halfedge != NULL );  
00490 
00491                 if( m_halfedge == (CHalfEdge*)m_vertex->most_ccw_out_halfedge() ) 
00492                 {
00493                         m_halfedge = NULL;
00494                         return;
00495                 }
00496                 m_halfedge = (CHalfEdge*)m_halfedge->ccw_rotate_about_source();
00497         };
00502         void operator++(int) //postfix
00503         {
00504                 assert( m_halfedge != NULL );  
00505 
00506                 if( m_halfedge == (CHalfEdge*)m_vertex->most_ccw_out_halfedge() ) 
00507                 {
00508                         m_halfedge = NULL;
00509                         return;
00510                 }
00511                 m_halfedge = (CHalfEdge*)m_halfedge->ccw_rotate_about_source();
00512         };
00516         CFace * value() { return (CFace*) m_halfedge->face(); };
00520          CFace * operator*() { return value(); };
00524          bool end(){ return m_halfedge == NULL; };
00528          void reset()   { m_halfedge = (CHalfEdge*)m_vertex->most_clw_out_halfedge(); };
00529 
00530 private:
00534         CVertex *   m_vertex;
00538         CHalfEdge * m_halfedge;
00539 };
00540 
00541 // f -> halfedge
00546 template<typename CVertex, typename CEdge, typename CFace, typename CHalfEdge>
00547 class FaceHalfedgeIterator
00548 {
00549 public:
00554         FaceHalfedgeIterator( CFace * f )
00555         { 
00556                 m_face = f; 
00557                 m_halfedge = (CHalfEdge*)f->halfedge(); 
00558         };
00562         ~FaceHalfedgeIterator(){};
00566         void operator++() //prefix
00567         {
00568                 assert( m_halfedge != NULL );
00569                 m_halfedge = (CHalfEdge*)m_halfedge->he_next();
00570 
00571                 if( m_halfedge == m_face->halfedge() )
00572                 {
00573                          m_halfedge = NULL;
00574                         return;
00575                 };
00576         }
00577 
00581         void operator++(int) //postfix
00582         {
00583                 assert( m_halfedge != NULL );
00584                 m_halfedge = (CHalfEdge*)m_halfedge->he_next();
00585 
00586                 if( m_halfedge == m_face->halfedge() )
00587                 {
00588                          m_halfedge = NULL;
00589                         return;
00590                 };
00591         }
00592 
00596         CHalfEdge * value() { return m_halfedge; };
00600         CHalfEdge * operator*() { return value(); };
00601 
00605         bool end(){ return m_halfedge == NULL; };
00606 
00607 private:
00611         CFace *        m_face;
00615         CHalfEdge * m_halfedge;
00616 };
00617 
00618 
00619 // f -> edge
00623 template<typename CVertex, typename CEdge, typename CFace, typename CHalfEdge>
00624 class FaceEdgeIterator
00625 {
00626 public:
00631         FaceEdgeIterator( CFace * f )
00632         { 
00633                 m_face = f; 
00634                 m_halfedge = (CHalfEdge*)f->halfedge(); 
00635         };
00636 
00640         ~FaceEdgeIterator(){};
00644         void operator++()       //prefix
00645         {
00646                 assert( m_halfedge != NULL );
00647                 m_halfedge = (CHalfEdge*)m_halfedge->he_next();
00648 
00649                 if( m_halfedge == (CHalfEdge*)m_face->halfedge() )
00650                 {
00651                          m_halfedge = NULL;
00652                         return;
00653                 };
00654         }
00655 
00659         void operator++(int)    //postfix
00660         {
00661                 assert( m_halfedge != NULL );
00662                 m_halfedge = (CHalfEdge*)m_halfedge->he_next();
00663 
00664                 if( m_halfedge == m_face->halfedge() )
00665                 {
00666                          m_halfedge = NULL;
00667                         return;
00668                 };
00669         }
00673         CEdge * value() { return (CEdge*) m_halfedge->edge(); };
00677         CEdge * operator*() { return value(); };
00681         bool end(){ return m_halfedge == NULL; };
00682 
00683 private:
00685         CFace  *       m_face;
00687         CHalfEdge * m_halfedge;
00688 };
00689 
00690 
00691 // f -> vertex
00695 template<typename CVertex, typename CEdge, typename CFace, typename CHalfEdge>
00696 class FaceVertexIterator
00697 {
00698 public:
00703         FaceVertexIterator( CFace * f )
00704         { 
00705                 m_face = f; 
00706                 m_halfedge = (CHalfEdge*)f->halfedge(); 
00707         };
00712         ~FaceVertexIterator(){};
00716         void operator++() //prefix
00717         {
00718                 assert( m_halfedge != NULL );
00719                 m_halfedge = (CHalfEdge*)m_halfedge->he_next();
00720 
00721                 if( m_halfedge == (CHalfEdge*)m_face->halfedge() )
00722                 {
00723                          m_halfedge = NULL;
00724                         return;
00725                 };
00726         }
00727 
00731         void operator++(int) //postfix
00732         {
00733                 assert( m_halfedge != NULL );
00734                 m_halfedge = (CHalfEdge*)m_halfedge->he_next();
00735 
00736                 if( m_halfedge == (CHalfEdge*)m_face->halfedge() )
00737                 {
00738                          m_halfedge = NULL;
00739                         return;
00740                 };
00741         }
00745         CVertex * value() { return (CVertex*) m_halfedge->target(); };
00749         CVertex * operator*() { return value(); };
00753         bool end(){ return m_halfedge == NULL; };
00754 
00755 private:
00758         CFace         * m_face;
00761         CHalfEdge * m_halfedge;
00762 };
00763 
00764 
00765 // mesh->v
00770 template<typename CVertex, typename CEdge, typename CFace, typename CHalfEdge>
00771 class MeshVertexIterator
00772 {
00773 public:
00778         MeshVertexIterator( CBaseMesh<CVertex,CEdge,CFace,CHalfEdge> * pMesh )
00779         {
00780                 m_pMesh = pMesh;
00781                 m_iter = m_pMesh->vertices().begin();
00782         }
00786         CVertex * value() { return *m_iter; };
00791         CVertex * operator*(){ return value(); };
00795         void operator++()        { ++ m_iter; }; //prefix
00799         void operator++(int) { ++ m_iter; }; //postfix
00803         bool end() { return m_iter == m_pMesh->vertices().end(); }
00804         
00805 private:
00809         CBaseMesh<CVertex,CEdge,CFace,CHalfEdge> * m_pMesh;
00813         typename std::list<CVertex*>::iterator m_iter;
00814 };
00815 
00816 // mesh->f
00820 template<typename CVertex, typename CEdge, typename CFace, typename CHalfEdge>
00821 class MeshFaceIterator
00822 {
00823 public:
00828         MeshFaceIterator( CBaseMesh<CVertex,CEdge,CFace,CHalfEdge> * pMesh )
00829         {
00830       m_pMesh = pMesh;
00831       m_iter = pMesh->faces().begin();
00832         }
00836         CFace * value() { return *m_iter; };
00840         CFace * operator*(){ return value(); };
00841 
00845         void operator++() { ++ m_iter; }; //prefix
00849         void operator++(int) { ++ m_iter; }; //postfix
00853         bool end() { return m_iter == m_pMesh->faces().end(); }
00854 
00855 private:
00858         CBaseMesh<CVertex,CEdge,CFace,CHalfEdge> * m_pMesh;
00861         typename std::list<CFace*>::iterator  m_iter;
00862 };
00863 
00864 //Mesh->e
00868 template<typename CVertex, typename CEdge, typename CFace, typename CHalfEdge>
00869 class MeshEdgeIterator
00870 {
00871 public:
00876         MeshEdgeIterator( CBaseMesh<CVertex,CEdge,CFace,CHalfEdge> * pMesh )
00877         {
00878                 m_pMesh = pMesh;
00879                 m_iter = m_pMesh->edges().begin();
00880         }
00884         CEdge * value() { return *m_iter; };
00888         CEdge * operator*(){ return value(); };
00892         void operator++() { ++ m_iter; }; //prefix
00896         void operator++(int) {m_iter++; }; //postfix
00900         bool end() { return m_iter == m_pMesh->edges().end(); }
00901 
00902 
00903 private:
00907         CBaseMesh<CVertex,CEdge,CFace,CHalfEdge> * m_pMesh;
00911         typename std::list<CEdge*>::iterator m_iter;
00912 };
00913 
00914 // Mesh->he
00918 template<typename CVertex, typename CEdge, typename CFace, typename CHalfEdge>
00919 class MeshHalfEdgeIterator
00920 {
00921 public:
00926         MeshHalfEdgeIterator( CBaseMesh<CVertex,CEdge,CFace,CHalfEdge> * pMesh )
00927         {
00928      m_pMesh = pMesh;
00929      m_iter = m_pMesh->edges().begin();
00930      m_id = 0;
00931         }
00935         CHalfEdge * value() { CEdge * e = *m_iter; return (CHalfEdge*)e->halfedge(m_id); };
00939         CHalfEdge * operator*(){ return value(); };
00943         void operator++() //prefix
00944         { 
00945                 ++m_id;
00946 
00947                 switch( m_id )
00948                 {
00949                 case 1:
00950                         {
00951                                 CEdge * e = *m_iter;
00952                                 if( e->halfedge(m_id) == NULL )
00953                                 {
00954                                         m_id = 0;
00955                                         ++ m_iter;
00956                                 }
00957                         }
00958                         break;
00959                 case 2:
00960                         m_id = 0;
00961                         ++m_iter;
00962                         break;
00963                 }
00964         };
00968         void operator++(int) //postfix
00969         { 
00970                 ++m_id;
00971 
00972                 switch( m_id )
00973                 {
00974                 case 1:
00975                         {
00976                                 CEdge * e = *m_iter;
00977                                 if( e->halfedge(m_id) == NULL )
00978                                 {
00979                                         m_id = 0;
00980                                         ++ m_iter;
00981                                 }
00982                         }
00983                         break;
00984                 case 2:
00985                         m_id = 0;
00986                         ++m_iter;
00987                         break;
00988                 }
00989         };
00993         bool end() { return m_iter == m_pMesh->edges().end(); }
00994         
00995 
00996 private:
01000         CHalfEdge * m_he;
01004         CBaseMesh<CVertex,CEdge,CFace,CHalfEdge> *       m_pMesh;
01008         typename std::list<CEdge*>::iterator m_iter;
01009         int  m_id;
01010 };
01011 
01012 
01013 } //Iterators
01014 
01015 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Defines