00001
00009 #ifndef _ITERATORS_H_
00010 #define _ITERATORS_H_
00011
00012 #include "BaseMesh.h"
00013
00014 namespace MeshLib{
00015
00016
00017
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++()
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)
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
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++()
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)
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
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++()
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)
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
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++()
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)
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
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++()
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)
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
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++()
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)
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
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++()
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)
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
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++()
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)
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
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; };
00799 void operator++(int) { ++ m_iter; };
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
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; };
00849 void operator++(int) { ++ m_iter; };
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
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; };
00896 void operator++(int) {m_iter++; };
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
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++()
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)
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 }
01014
01015 #endif