Developer Documentation
PolyConnectivity.hh
1 /* ========================================================================= *
2  * *
3  * OpenMesh *
4  * Copyright (c) 2001-2015, RWTH-Aachen University *
5  * Department of Computer Graphics and Multimedia *
6  * All rights reserved. *
7  * www.openmesh.org *
8  * *
9  *---------------------------------------------------------------------------*
10  * This file is part of OpenMesh. *
11  *---------------------------------------------------------------------------*
12  * *
13  * Redistribution and use in source and binary forms, with or without *
14  * modification, are permitted provided that the following conditions *
15  * are met: *
16  * *
17  * 1. Redistributions of source code must retain the above copyright notice, *
18  * this list of conditions and the following disclaimer. *
19  * *
20  * 2. Redistributions in binary form must reproduce the above copyright *
21  * notice, this list of conditions and the following disclaimer in the *
22  * documentation and/or other materials provided with the distribution. *
23  * *
24  * 3. Neither the name of the copyright holder nor the names of its *
25  * contributors may be used to endorse or promote products derived from *
26  * this software without specific prior written permission. *
27  * *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39  * *
40  * ========================================================================= */
41 
42 
43 
44 #ifndef OPENMESH_POLYCONNECTIVITY_HH
45 #define OPENMESH_POLYCONNECTIVITY_HH
46 
47 #include <OpenMesh/Core/Mesh/ArrayKernel.hh>
48 #include <OpenMesh/Core/Mesh/SmartRange.hh>
49 
50 namespace OpenMesh
51 {
52 
53 namespace Iterators
54 {
55  template <class Mesh, class ValueHandle, class MemberOwner, bool (MemberOwner::*PrimitiveStatusMember)() const, size_t (MemberOwner::*PrimitiveCountMember)() const>
56  class GenericIteratorT;
57 
58  template<class Mesh>
59  class GenericCirculatorBaseT;
60 
61  template<typename Traits>
62  class GenericCirculatorT_DEPRECATED;
63 
64  template<typename Traits, bool CW>
65  class GenericCirculatorT;
66 }
67 
68 template <typename RangeTraitT>
70 
71 template<
72  typename CONTAINER_T,
73  typename ITER_T,
74  ITER_T (CONTAINER_T::*begin_fn)() const,
75  ITER_T (CONTAINER_T::*end_fn)() const>
77 {
78  using CONTAINER_TYPE = CONTAINER_T;
79  using ITER_TYPE = ITER_T;
80  static ITER_TYPE begin(const CONTAINER_TYPE& _container) { return (_container.*begin_fn)(); }
81  static ITER_TYPE end(const CONTAINER_TYPE& _container) { return (_container.*end_fn)(); }
82 };
83 
84 
85 template <typename CirculatorRangeTraitT>
87 
88 template<
89  typename CONTAINER_T,
90  typename ITER_T,
91  typename CENTER_ENTITY_T,
92  typename TO_ENTITY_T,
93  ITER_T (CONTAINER_T::*begin_fn)(CENTER_ENTITY_T) const,
94  ITER_T (CONTAINER_T::*end_fn)(CENTER_ENTITY_T) const>
96 {
97  using CONTAINER_TYPE = CONTAINER_T;
98  using ITER_TYPE = ITER_T;
99  using CENTER_ENTITY_TYPE = CENTER_ENTITY_T;
100  using TO_ENTITYE_TYPE = TO_ENTITY_T;
101  static ITER_TYPE begin(const CONTAINER_TYPE& _container, CENTER_ENTITY_TYPE _ce) { return (_container.*begin_fn)(_ce); }
102  static ITER_TYPE end(const CONTAINER_TYPE& _container, CENTER_ENTITY_TYPE _ce) { return (_container.*end_fn)(_ce); }
103 };
104 
105 struct SmartVertexHandle;
106 struct SmartHalfedgeHandle;
107 struct SmartEdgeHandle;
108 struct SmartFaceHandle;
109 
112 class OPENMESHDLLEXPORT PolyConnectivity : public ArrayKernel
113 {
114 public:
116 
117  static const VertexHandle InvalidVertexHandle;
126 
127  typedef PolyConnectivity This;
128 
129  //--- iterators ---
130 
141 
142  typedef VertexIter ConstVertexIter;
143  typedef HalfedgeIter ConstHalfedgeIter;
144  typedef EdgeIter ConstEdgeIter;
145  typedef FaceIter ConstFaceIter;
147 
148  //--- circulators ---
149 
155 
156  /*
157  * Vertex-centered circulators
158  */
159 
161  {
162  using Mesh = This;
165  static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return _mesh->to_vertex_handle(_heh);}
166  };
167 
168 
174 
179 
180 
182  {
183  using Mesh = This;
186  static ValueHandle toHandle(const Mesh* const /*_mesh*/, This::HalfedgeHandle _heh) { return _heh;}
187  };
188 
194 
199 
201  {
202  using Mesh = This;
205  static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return _mesh->opposite_halfedge_handle(_heh); }
206  };
207 
213 
218 
219 
221  {
222  using Mesh = This;
225  static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->face_handle(_heh); }
226  };
227 
233 
238 
239 
241  {
242  using Mesh = This;
245  static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->edge_handle(_heh); }
246  };
247 
257 
258 
260  {
261  using Mesh = This;
264  static ValueHandle toHandle(const Mesh* const /*_mesh*/, This::HalfedgeHandle _heh) { return _heh; }
265  };
266 
276 
277  typedef VertexVertexIter ConstVertexVertexIter;
278  typedef VertexVertexCWIter ConstVertexVertexCWIter;
279  typedef VertexVertexCCWIter ConstVertexVertexCCWIter;
280  typedef VertexOHalfedgeIter ConstVertexOHalfedgeIter;
281  typedef VertexOHalfedgeCWIter ConstVertexOHalfedgeCWIter;
282  typedef VertexOHalfedgeCCWIter ConstVertexOHalfedgeCCWIter;
283  typedef VertexIHalfedgeIter ConstVertexIHalfedgeIter;
284  typedef VertexIHalfedgeCWIter ConstVertexIHalfedgeCWIter;
285  typedef VertexIHalfedgeCCWIter ConstVertexIHalfedgeCCWIter;
286  typedef VertexFaceIter ConstVertexFaceIter;
287  typedef VertexFaceCWIter ConstVertexFaceCWIter;
288  typedef VertexFaceCCWIter ConstVertexFaceCCWIter;
289  typedef VertexEdgeIter ConstVertexEdgeIter;
290  typedef VertexEdgeCWIter ConstVertexEdgeCWIter;
291  typedef VertexEdgeCCWIter ConstVertexEdgeCCWIter;
292 
293  /*
294  * Face-centered circulators
295  */
296 
298  {
299  using Mesh = This;
302  static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->to_vertex_handle(_heh); }
303  };
304 
310 
315 
321 
326 
327 
329  {
330  using Mesh = This;
333  static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->edge_handle(_heh); }
334  };
335 
341 
346 
347 
349  {
350  using Mesh = This;
353  static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->face_handle(_mesh->opposite_halfedge_handle(_heh)); }
354  };
355 
361 
366 
367  typedef FaceVertexIter ConstFaceVertexIter;
368  typedef FaceVertexCWIter ConstFaceVertexCWIter;
369  typedef FaceVertexCCWIter ConstFaceVertexCCWIter;
370  typedef FaceHalfedgeIter ConstFaceHalfedgeIter;
371  typedef FaceHalfedgeCWIter ConstFaceHalfedgeCWIter;
372  typedef FaceHalfedgeCCWIter ConstFaceHalfedgeCCWIter;
373  typedef FaceEdgeIter ConstFaceEdgeIter;
374  typedef FaceEdgeCWIter ConstFaceEdgeCWIter;
375  typedef FaceEdgeCCWIter ConstFaceEdgeCCWIter;
376  typedef FaceFaceIter ConstFaceFaceIter;
377  typedef FaceFaceCWIter ConstFaceFaceCWIter;
378  typedef FaceFaceCCWIter ConstFaceFaceCCWIter;
379 
380  /*
381  * Halfedge circulator
382  */
383  typedef HalfedgeLoopIter ConstHalfedgeLoopIter;
384  typedef HalfedgeLoopCWIter ConstHalfedgeLoopCWIter;
385  typedef HalfedgeLoopCCWIter ConstHalfedgeLoopCCWIter;
386 
388 
389  // --- shortcuts
390 
395  typedef VertexHandle VHandle;
400 
401  typedef VertexIter VIter;
402  typedef HalfedgeIter HIter;
403  typedef EdgeIter EIter;
404  typedef FaceIter FIter;
405 
406  typedef ConstVertexIter CVIter;
407  typedef ConstHalfedgeIter CHIter;
408  typedef ConstEdgeIter CEIter;
409  typedef ConstFaceIter CFIter;
410 
411  typedef VertexVertexIter VVIter;
412  typedef VertexVertexCWIter VVCWIter;
413  typedef VertexVertexCCWIter VVCCWIter;
414  typedef VertexOHalfedgeIter VOHIter;
415  typedef VertexOHalfedgeCWIter VOHCWIter;
416  typedef VertexOHalfedgeCCWIter VOHCCWIter;
417  typedef VertexIHalfedgeIter VIHIter;
418  typedef VertexIHalfedgeCWIter VIHICWter;
419  typedef VertexIHalfedgeCCWIter VIHICCWter;
420  typedef VertexEdgeIter VEIter;
421  typedef VertexEdgeCWIter VECWIter;
422  typedef VertexEdgeCCWIter VECCWIter;
423  typedef VertexFaceIter VFIter;
424  typedef VertexFaceCWIter VFCWIter;
425  typedef VertexFaceCCWIter VFCCWIter;
426  typedef FaceVertexIter FVIter;
427  typedef FaceVertexCWIter FVCWIter;
428  typedef FaceVertexCCWIter FVCCWIter;
429  typedef FaceHalfedgeIter FHIter;
430  typedef FaceHalfedgeCWIter FHCWIter;
431  typedef FaceHalfedgeCCWIter FHCWWIter;
432  typedef FaceEdgeIter FEIter;
433  typedef FaceEdgeCWIter FECWIter;
434  typedef FaceEdgeCCWIter FECWWIter;
435  typedef FaceFaceIter FFIter;
436 
437  typedef ConstVertexVertexIter CVVIter;
438  typedef ConstVertexVertexCWIter CVVCWIter;
439  typedef ConstVertexVertexCCWIter CVVCCWIter;
440  typedef ConstVertexOHalfedgeIter CVOHIter;
441  typedef ConstVertexOHalfedgeCWIter CVOHCWIter;
442  typedef ConstVertexOHalfedgeCCWIter CVOHCCWIter;
443  typedef ConstVertexIHalfedgeIter CVIHIter;
444  typedef ConstVertexIHalfedgeCWIter CVIHCWIter;
445  typedef ConstVertexIHalfedgeCCWIter CVIHCCWIter;
446  typedef ConstVertexEdgeIter CVEIter;
447  typedef ConstVertexEdgeCWIter CVECWIter;
448  typedef ConstVertexEdgeCCWIter CVECCWIter;
449  typedef ConstVertexFaceIter CVFIter;
450  typedef ConstVertexFaceCWIter CVFCWIter;
451  typedef ConstVertexFaceCCWIter CVFCCWIter;
452  typedef ConstFaceVertexIter CFVIter;
453  typedef ConstFaceVertexCWIter CFVCWIter;
454  typedef ConstFaceVertexCCWIter CFVCCWIter;
455  typedef ConstFaceHalfedgeIter CFHIter;
456  typedef ConstFaceHalfedgeCWIter CFHCWIter;
457  typedef ConstFaceHalfedgeCCWIter CFHCCWIter;
458  typedef ConstFaceEdgeIter CFEIter;
459  typedef ConstFaceEdgeCWIter CFECWIter;
460  typedef ConstFaceEdgeCCWIter CFECCWIter;
461  typedef ConstFaceFaceIter CFFIter;
462  typedef ConstFaceFaceCWIter CFFCWIter;
463  typedef ConstFaceFaceCCWIter CFFCCWIter;
465 
466 public:
467 
468  PolyConnectivity() {}
469  virtual ~PolyConnectivity() {}
470 
471  inline static bool is_triangles()
472  { return false; }
473 
476  inline void assign_connectivity(const PolyConnectivity& _other)
478 
482 
484  inline SmartVertexHandle add_vertex();
485 
493  SmartFaceHandle add_face(const std::vector<VertexHandle>& _vhandles);
494 
502  SmartFaceHandle add_face(const std::vector<SmartVertexHandle>& _vhandles);
503 
504 
514  SmartFaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2);
515 
526  SmartFaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2, VertexHandle _vh3);
527 
536  SmartFaceHandle add_face(const VertexHandle* _vhandles, size_t _vhs_size);
537 
539 
541 
542 
547  bool is_collapse_ok(HalfedgeHandle _he);
548 
549 
555  void delete_vertex(VertexHandle _vh, bool _delete_isolated_vertices = true);
556 
565  void delete_edge(EdgeHandle _eh, bool _delete_isolated_vertices=true);
566 
577  void delete_face(FaceHandle _fh, bool _delete_isolated_vertices=true);
578 
579 
581 
585 
586  using ArrayKernel::next_halfedge_handle;
587  using ArrayKernel::prev_halfedge_handle;
588  using ArrayKernel::opposite_halfedge_handle;
589  using ArrayKernel::ccw_rotated_halfedge_handle;
590  using ArrayKernel::cw_rotated_halfedge_handle;
591 
592  inline SmartHalfedgeHandle next_halfedge_handle (SmartHalfedgeHandle _heh) const;
593  inline SmartHalfedgeHandle prev_halfedge_handle (SmartHalfedgeHandle _heh) const;
594  inline SmartHalfedgeHandle opposite_halfedge_handle (SmartHalfedgeHandle _heh) const;
595  inline SmartHalfedgeHandle ccw_rotated_halfedge_handle(SmartHalfedgeHandle _heh) const;
596  inline SmartHalfedgeHandle cw_rotated_halfedge_handle (SmartHalfedgeHandle _heh) const;
597 
598  using ArrayKernel::s_halfedge_handle;
599  using ArrayKernel::s_edge_handle;
600 
601  static SmartHalfedgeHandle s_halfedge_handle(SmartEdgeHandle _eh, unsigned int _i);
602  static SmartEdgeHandle s_edge_handle(SmartHalfedgeHandle _heh);
603 
604  using ArrayKernel::halfedge_handle;
605  using ArrayKernel::edge_handle;
606  using ArrayKernel::face_handle;
607 
608  inline SmartHalfedgeHandle halfedge_handle(SmartEdgeHandle _eh, unsigned int _i) const;
609  inline SmartHalfedgeHandle halfedge_handle(SmartFaceHandle _fh) const;
610  inline SmartHalfedgeHandle halfedge_handle(SmartVertexHandle _vh) const;
611  inline SmartEdgeHandle edge_handle(SmartHalfedgeHandle _heh) const;
612  inline SmartFaceHandle face_handle(SmartHalfedgeHandle _heh) const;
613 
614 
616 
620 
622  VertexIter vertices_begin();
624  ConstVertexIter vertices_begin() const;
626  VertexIter vertices_end();
628  ConstVertexIter vertices_end() const;
629 
631  HalfedgeIter halfedges_begin();
633  ConstHalfedgeIter halfedges_begin() const;
635  HalfedgeIter halfedges_end();
637  ConstHalfedgeIter halfedges_end() const;
638 
640  EdgeIter edges_begin();
642  ConstEdgeIter edges_begin() const;
644  EdgeIter edges_end();
646  ConstEdgeIter edges_end() const;
647 
649  FaceIter faces_begin();
651  ConstFaceIter faces_begin() const;
653  FaceIter faces_end();
655  ConstFaceIter faces_end() const;
657 
658 
662 
664  VertexIter vertices_sbegin();
666  ConstVertexIter vertices_sbegin() const;
667 
669  HalfedgeIter halfedges_sbegin();
671  ConstHalfedgeIter halfedges_sbegin() const;
672 
674  EdgeIter edges_sbegin();
676  ConstEdgeIter edges_sbegin() const;
677 
679  FaceIter faces_sbegin();
681  ConstFaceIter faces_sbegin() const;
682 
684 
685  //--- circulators ---
686 
690 
692  VertexVertexIter vv_iter(VertexHandle _vh);
694  VertexVertexCWIter vv_cwiter(VertexHandle _vh);
696  VertexVertexCCWIter vv_ccwiter(VertexHandle _vh);
698  VertexIHalfedgeIter vih_iter(VertexHandle _vh);
700  VertexIHalfedgeCWIter vih_cwiter(VertexHandle _vh);
702  VertexIHalfedgeCCWIter vih_ccwiter(VertexHandle _vh);
704  VertexOHalfedgeIter voh_iter(VertexHandle _vh);
706  VertexOHalfedgeCWIter voh_cwiter(VertexHandle _vh);
708  VertexOHalfedgeCCWIter voh_ccwiter(VertexHandle _vh);
710  VertexEdgeIter ve_iter(VertexHandle _vh);
712  VertexEdgeCWIter ve_cwiter(VertexHandle _vh);
714  VertexEdgeCCWIter ve_ccwiter(VertexHandle _vh);
716  VertexFaceIter vf_iter(VertexHandle _vh);
718  VertexFaceCWIter vf_cwiter(VertexHandle _vh);
720  VertexFaceCCWIter vf_ccwiter(VertexHandle _vh);
721 
723  ConstVertexVertexIter cvv_iter(VertexHandle _vh) const;
725  ConstVertexVertexCWIter cvv_cwiter(VertexHandle _vh) const;
727  ConstVertexVertexCCWIter cvv_ccwiter(VertexHandle _vh) const;
729  ConstVertexIHalfedgeIter cvih_iter(VertexHandle _vh) const;
731  ConstVertexIHalfedgeCWIter cvih_cwiter(VertexHandle _vh) const;
733  ConstVertexIHalfedgeCCWIter cvih_ccwiter(VertexHandle _vh) const;
735  ConstVertexOHalfedgeIter cvoh_iter(VertexHandle _vh) const;
737  ConstVertexOHalfedgeCWIter cvoh_cwiter(VertexHandle _vh) const;
739  ConstVertexOHalfedgeCCWIter cvoh_ccwiter(VertexHandle _vh) const;
741  ConstVertexEdgeIter cve_iter(VertexHandle _vh) const;
743  ConstVertexEdgeCWIter cve_cwiter(VertexHandle _vh) const;
745  ConstVertexEdgeCCWIter cve_ccwiter(VertexHandle _vh) const;
747  ConstVertexFaceIter cvf_iter(VertexHandle _vh) const;
749  ConstVertexFaceCWIter cvf_cwiter(VertexHandle _vh) const;
751  ConstVertexFaceCCWIter cvf_ccwiter(VertexHandle _vh) const;
752 
754  FaceVertexIter fv_iter(FaceHandle _fh);
756  FaceVertexCWIter fv_cwiter(FaceHandle _fh);
758  FaceVertexCCWIter fv_ccwiter(FaceHandle _fh);
760  FaceHalfedgeIter fh_iter(FaceHandle _fh);
762  FaceHalfedgeCWIter fh_cwiter(FaceHandle _fh);
764  FaceHalfedgeCCWIter fh_ccwiter(FaceHandle _fh);
766  FaceEdgeIter fe_iter(FaceHandle _fh);
768  FaceEdgeCWIter fe_cwiter(FaceHandle _fh);
770  FaceEdgeCCWIter fe_ccwiter(FaceHandle _fh);
772  FaceFaceIter ff_iter(FaceHandle _fh);
774  FaceFaceCWIter ff_cwiter(FaceHandle _fh);
776  FaceFaceCCWIter ff_ccwiter(FaceHandle _fh);
777 
779  ConstFaceVertexIter cfv_iter(FaceHandle _fh) const;
781  ConstFaceVertexCWIter cfv_cwiter(FaceHandle _fh) const;
783  ConstFaceVertexCCWIter cfv_ccwiter(FaceHandle _fh) const;
785  ConstFaceHalfedgeIter cfh_iter(FaceHandle _fh) const;
787  ConstFaceHalfedgeCWIter cfh_cwiter(FaceHandle _fh) const;
789  ConstFaceHalfedgeCCWIter cfh_ccwiter(FaceHandle _fh) const;
791  ConstFaceEdgeIter cfe_iter(FaceHandle _fh) const;
793  ConstFaceEdgeCWIter cfe_cwiter(FaceHandle _fh) const;
795  ConstFaceEdgeCCWIter cfe_ccwiter(FaceHandle _fh) const;
797  ConstFaceFaceIter cff_iter(FaceHandle _fh) const;
799  ConstFaceFaceCWIter cff_cwiter(FaceHandle _fh) const;
801  ConstFaceFaceCCWIter cff_ccwiter(FaceHandle _fh) const;
802 
803  // 'begin' circulators
804 
806  VertexVertexIter vv_begin(VertexHandle _vh);
808  VertexVertexCWIter vv_cwbegin(VertexHandle _vh);
810  VertexVertexCCWIter vv_ccwbegin(VertexHandle _vh);
812  VertexIHalfedgeIter vih_begin(VertexHandle _vh);
814  VertexIHalfedgeCWIter vih_cwbegin(VertexHandle _vh);
816  VertexIHalfedgeCCWIter vih_ccwbegin(VertexHandle _vh);
818  VertexOHalfedgeIter voh_begin(VertexHandle _vh);
820  VertexOHalfedgeCWIter voh_cwbegin(VertexHandle _vh);
822  VertexOHalfedgeCCWIter voh_ccwbegin(VertexHandle _vh);
824  VertexEdgeIter ve_begin(VertexHandle _vh);
826  VertexEdgeCWIter ve_cwbegin(VertexHandle _vh);
828  VertexEdgeCCWIter ve_ccwbegin(VertexHandle _vh);
830  VertexFaceIter vf_begin(VertexHandle _vh);
832  VertexFaceCWIter vf_cwbegin(VertexHandle _vh);
834  VertexFaceCCWIter vf_ccwbegin(VertexHandle _vh);
835 
836 
838  ConstVertexVertexIter cvv_begin(VertexHandle _vh) const;
840  ConstVertexVertexCWIter cvv_cwbegin(VertexHandle _vh) const;
842  ConstVertexVertexCCWIter cvv_ccwbegin(VertexHandle _vh) const;
844  ConstVertexIHalfedgeIter cvih_begin(VertexHandle _vh) const;
846  ConstVertexIHalfedgeCWIter cvih_cwbegin(VertexHandle _vh) const;
848  ConstVertexIHalfedgeCCWIter cvih_ccwbegin(VertexHandle _vh) const;
850  ConstVertexOHalfedgeIter cvoh_begin(VertexHandle _vh) const;
852  ConstVertexOHalfedgeCWIter cvoh_cwbegin(VertexHandle _vh) const;
854  ConstVertexOHalfedgeCCWIter cvoh_ccwbegin(VertexHandle _vh) const;
856  ConstVertexEdgeIter cve_begin(VertexHandle _vh) const;
858  ConstVertexEdgeCWIter cve_cwbegin(VertexHandle _vh) const;
860  ConstVertexEdgeCCWIter cve_ccwbegin(VertexHandle _vh) const;
862  ConstVertexFaceIter cvf_begin(VertexHandle _vh) const;
864  ConstVertexFaceCWIter cvf_cwbegin(VertexHandle _vh) const;
866  ConstVertexFaceCCWIter cvf_ccwbegin(VertexHandle _vh) const;
867 
869  FaceVertexIter fv_begin(FaceHandle _fh);
871  FaceVertexCWIter fv_cwbegin(FaceHandle _fh);
873  FaceVertexCCWIter fv_ccwbegin(FaceHandle _fh);
875  FaceHalfedgeIter fh_begin(FaceHandle _fh);
877  FaceHalfedgeCWIter fh_cwbegin(FaceHandle _fh);
879  FaceHalfedgeCCWIter fh_ccwbegin(FaceHandle _fh);
881  FaceEdgeIter fe_begin(FaceHandle _fh);
883  FaceEdgeCWIter fe_cwbegin(FaceHandle _fh);
885  FaceEdgeCCWIter fe_ccwbegin(FaceHandle _fh);
887  FaceFaceIter ff_begin(FaceHandle _fh);
889  FaceFaceCWIter ff_cwbegin(FaceHandle _fh);
891  FaceFaceCCWIter ff_ccwbegin(FaceHandle _fh);
893  HalfedgeLoopIter hl_begin(HalfedgeHandle _heh);
895  HalfedgeLoopCWIter hl_cwbegin(HalfedgeHandle _heh);
897  HalfedgeLoopCCWIter hl_ccwbegin(HalfedgeHandle _heh);
898 
900  ConstFaceVertexIter cfv_begin(FaceHandle _fh) const;
902  ConstFaceVertexCWIter cfv_cwbegin(FaceHandle _fh) const;
904  ConstFaceVertexCCWIter cfv_ccwbegin(FaceHandle _fh) const;
906  ConstFaceHalfedgeIter cfh_begin(FaceHandle _fh) const;
908  ConstFaceHalfedgeCWIter cfh_cwbegin(FaceHandle _fh) const;
910  ConstFaceHalfedgeCCWIter cfh_ccwbegin(FaceHandle _fh) const;
912  ConstFaceEdgeIter cfe_begin(FaceHandle _fh) const;
914  ConstFaceEdgeCWIter cfe_cwbegin(FaceHandle _fh) const;
916  ConstFaceEdgeCCWIter cfe_ccwbegin(FaceHandle _fh) const;
918  ConstFaceFaceIter cff_begin(FaceHandle _fh) const;
920  ConstFaceFaceCWIter cff_cwbegin(FaceHandle _fh) const;
922  ConstFaceFaceCCWIter cff_ccwbegin(FaceHandle _fh) const;
924  ConstHalfedgeLoopIter chl_begin(HalfedgeHandle _heh) const;
926  ConstHalfedgeLoopCWIter chl_cwbegin(HalfedgeHandle _heh) const;
928  ConstHalfedgeLoopCCWIter chl_ccwbegin(HalfedgeHandle _heh) const;
929 
930  // 'end' circulators
931 
933  VertexVertexIter vv_end(VertexHandle _vh);
935  VertexVertexCWIter vv_cwend(VertexHandle _vh);
937  VertexVertexCCWIter vv_ccwend(VertexHandle _vh);
939  VertexIHalfedgeIter vih_end(VertexHandle _vh);
941  VertexIHalfedgeCWIter vih_cwend(VertexHandle _vh);
943  VertexIHalfedgeCCWIter vih_ccwend(VertexHandle _vh);
945  VertexOHalfedgeIter voh_end(VertexHandle _vh);
947  VertexOHalfedgeCWIter voh_cwend(VertexHandle _vh);
949  VertexOHalfedgeCCWIter voh_ccwend(VertexHandle _vh);
951  VertexEdgeIter ve_end(VertexHandle _vh);
953  VertexEdgeCWIter ve_cwend(VertexHandle _vh);
955  VertexEdgeCCWIter ve_ccwend(VertexHandle _vh);
957  VertexFaceIter vf_end(VertexHandle _vh);
959  VertexFaceCWIter vf_cwend(VertexHandle _vh);
961  VertexFaceCCWIter vf_ccwend(VertexHandle _vh);
962 
964  ConstVertexVertexIter cvv_end(VertexHandle _vh) const;
966  ConstVertexVertexCWIter cvv_cwend(VertexHandle _vh) const;
968  ConstVertexVertexCCWIter cvv_ccwend(VertexHandle _vh) const;
970  ConstVertexIHalfedgeIter cvih_end(VertexHandle _vh) const;
972  ConstVertexIHalfedgeCWIter cvih_cwend(VertexHandle _vh) const;
974  ConstVertexIHalfedgeCCWIter cvih_ccwend(VertexHandle _vh) const;
976  ConstVertexOHalfedgeIter cvoh_end(VertexHandle _vh) const;
978  ConstVertexOHalfedgeCWIter cvoh_cwend(VertexHandle _vh) const;
980  ConstVertexOHalfedgeCCWIter cvoh_ccwend(VertexHandle _vh) const;
982  ConstVertexEdgeIter cve_end(VertexHandle _vh) const;
984  ConstVertexEdgeCWIter cve_cwend(VertexHandle _vh) const;
986  ConstVertexEdgeCCWIter cve_ccwend(VertexHandle _vh) const;
988  ConstVertexFaceIter cvf_end(VertexHandle _vh) const;
990  ConstVertexFaceCWIter cvf_cwend(VertexHandle _vh) const;
992  ConstVertexFaceCCWIter cvf_ccwend(VertexHandle _vh) const;
993 
995  FaceVertexIter fv_end(FaceHandle _fh);
997  FaceVertexCWIter fv_cwend(FaceHandle _fh);
999  FaceVertexCCWIter fv_ccwend(FaceHandle _fh);
1001  FaceHalfedgeIter fh_end(FaceHandle _fh);
1003  FaceHalfedgeCWIter fh_cwend(FaceHandle _fh);
1005  FaceHalfedgeCCWIter fh_ccwend(FaceHandle _fh);
1007  FaceEdgeIter fe_end(FaceHandle _fh);
1009  FaceEdgeCWIter fe_cwend(FaceHandle _fh);
1011  FaceEdgeCCWIter fe_ccwend(FaceHandle _fh);
1013  FaceFaceIter ff_end(FaceHandle _fh);
1015  FaceFaceCWIter ff_cwend(FaceHandle _fh);
1017  FaceFaceCCWIter ff_ccwend(FaceHandle _fh);
1019  HalfedgeLoopIter hl_end(HalfedgeHandle _heh);
1021  HalfedgeLoopCWIter hl_cwend(HalfedgeHandle _heh);
1023  HalfedgeLoopCCWIter hl_ccwend(HalfedgeHandle _heh);
1024 
1026  ConstFaceVertexIter cfv_end(FaceHandle _fh) const;
1028  ConstFaceVertexCWIter cfv_cwend(FaceHandle _fh) const;
1030  ConstFaceVertexCCWIter cfv_ccwend(FaceHandle _fh) const;
1032  ConstFaceHalfedgeIter cfh_end(FaceHandle _fh) const;
1034  ConstFaceHalfedgeCWIter cfh_cwend(FaceHandle _fh) const;
1036  ConstFaceHalfedgeCCWIter cfh_ccwend(FaceHandle _fh) const;
1038  ConstFaceEdgeIter cfe_end(FaceHandle _fh) const;
1040  ConstFaceEdgeCWIter cfe_cwend(FaceHandle _fh) const;
1042  ConstFaceEdgeCCWIter cfe_ccwend(FaceHandle _fh) const;
1044  ConstFaceFaceIter cff_end(FaceHandle _fh) const;
1046  ConstFaceFaceCWIter cff_cwend(FaceHandle _fh) const;
1048  ConstFaceFaceCCWIter cff_ccwend(FaceHandle _fh) const;
1050  ConstHalfedgeLoopIter chl_end(HalfedgeHandle _heh) const;
1052  ConstHalfedgeLoopCWIter chl_cwend(HalfedgeHandle _heh) const;
1054  ConstHalfedgeLoopCCWIter chl_ccwend(HalfedgeHandle _heh) const;
1056 
1059 
1060  typedef EntityRange<RangeTraitT<
1061  const PolyConnectivity,
1065  typedef EntityRange<RangeTraitT<
1066  const PolyConnectivity,
1070  typedef EntityRange<RangeTraitT<
1071  const PolyConnectivity,
1075  typedef EntityRange<RangeTraitT<
1076  const PolyConnectivity,
1080  typedef EntityRange<RangeTraitT<
1081  const PolyConnectivity,
1085  typedef EntityRange<RangeTraitT<
1086  const PolyConnectivity,
1090  typedef EntityRange<RangeTraitT<
1091  const PolyConnectivity,
1095  typedef EntityRange<RangeTraitT<
1096  const PolyConnectivity,
1100 
1101 
1102  template <typename HandleType>
1104 
1109  ConstVertexRangeSkipping vertices() const;
1110 
1115  ConstVertexRange all_vertices() const;
1116 
1121  ConstHalfedgeRangeSkipping halfedges() const;
1122 
1127  ConstHalfedgeRange all_halfedges() const;
1128 
1133  ConstEdgeRangeSkipping edges() const;
1134 
1139  ConstEdgeRange all_edges() const;
1140 
1145  ConstFaceRangeSkipping faces() const;
1146 
1151  ConstFaceRange all_faces() const;
1152 
1157  template <typename HandleType>
1158  typename ElementRange<HandleType>::RangeSkipping elements() const;
1159 
1164  template <typename HandleType>
1165  typename ElementRange<HandleType>::Range all_elements() const;
1166 
1167 
1169  PolyConnectivity,
1170  ConstVertexVertexCWIter,
1171  VertexHandle,
1172  VertexHandle,
1176  PolyConnectivity,
1177  ConstVertexIHalfedgeIter,
1178  VertexHandle,
1183  PolyConnectivity,
1184  ConstVertexOHalfedgeIter,
1185  VertexHandle,
1186  HalfedgeHandle,
1190  PolyConnectivity,
1191  ConstVertexEdgeIter,
1192  VertexHandle,
1193  EdgeHandle,
1197  PolyConnectivity,
1198  ConstVertexFaceIter,
1199  VertexHandle,
1200  FaceHandle,
1204  PolyConnectivity,
1205  ConstFaceVertexIter,
1206  FaceHandle,
1207  VertexHandle,
1211  PolyConnectivity,
1212  ConstFaceHalfedgeIter,
1213  FaceHandle,
1214  HalfedgeHandle,
1218  PolyConnectivity,
1219  ConstFaceEdgeIter,
1220  FaceHandle,
1221  EdgeHandle,
1225  PolyConnectivity,
1226  ConstFaceFaceIter,
1227  FaceHandle,
1228  FaceHandle,
1231 
1236  ConstVertexVertexRange vv_range(VertexHandle _vh) const;
1237 
1242  ConstVertexIHalfedgeRange vih_range(VertexHandle _vh) const;
1243 
1248  ConstVertexOHalfedgeRange voh_range(VertexHandle _vh) const;
1249 
1254  ConstVertexEdgeRange ve_range(VertexHandle _vh) const ;
1255 
1260  ConstVertexFaceRange vf_range(VertexHandle _vh) const;
1261 
1266  ConstFaceVertexRange fv_range(FaceHandle _fh) const;
1267 
1272  ConstFaceHalfedgeRange fh_range(FaceHandle _fh) const;
1273 
1278  ConstFaceEdgeRange fe_range(FaceHandle _fh) const;
1279 
1284  ConstFaceFaceRange ff_range(FaceHandle _fh) const;
1285 
1287 
1288  //===========================================================================
1291  //===========================================================================
1292 
1300  bool is_boundary(HalfedgeHandle _heh) const
1301  { return ArrayKernel::is_boundary(_heh); }
1302 
1311  bool is_boundary(EdgeHandle _eh) const
1312  {
1313  return (is_boundary(halfedge_handle(_eh, 0)) ||
1314  is_boundary(halfedge_handle(_eh, 1)));
1315  }
1316 
1328  bool is_boundary(VertexHandle _vh) const
1329  {
1330  HalfedgeHandle heh(halfedge_handle(_vh));
1331  return (!(heh.is_valid() && face_handle(heh).is_valid()));
1332  }
1333 
1343  bool is_boundary(FaceHandle _fh, bool _check_vertex=false) const;
1344 
1355  bool is_manifold(VertexHandle _vh) const;
1356 
1359  // --- shortcuts ---
1360 
1362  inline FaceHandle opposite_face_handle(HalfedgeHandle _heh) const
1363  { return face_handle(opposite_halfedge_handle(_heh)); }
1364 
1365  // --- misc ---
1366 
1370  void adjust_outgoing_halfedge(VertexHandle _vh);
1371 
1373  HalfedgeHandle find_halfedge(VertexHandle _start_vh, VertexHandle _end_vh) const;
1375  uint valence(VertexHandle _vh) const;
1377  uint valence(FaceHandle _fh) const;
1378 
1379  // --- connectivity operattions
1380 
1395  void collapse(HalfedgeHandle _heh);
1400  bool is_simple_link(EdgeHandle _eh) const;
1405  bool is_simply_connected(FaceHandle _fh) const;
1418  FaceHandle remove_edge(EdgeHandle _eh);
1422  void reinsert_edge(EdgeHandle _eh);
1432  HalfedgeHandle insert_edge(HalfedgeHandle _prev_heh, HalfedgeHandle _next_heh);
1433 
1446  void split(FaceHandle _fh, VertexHandle _vh);
1447 
1461  void split_copy(FaceHandle _fh, VertexHandle _vh);
1462 
1476  void triangulate(FaceHandle _fh);
1477 
1480  void triangulate();
1481 
1492  void split_edge(EdgeHandle _eh, VertexHandle _vh);
1493 
1505  void split_edge_copy(EdgeHandle _eh, VertexHandle _vh);
1506 
1507 
1513  const Vertex& deref(VertexHandle _h) const { return vertex(_h); }
1515  Vertex& deref(VertexHandle _h) { return vertex(_h); }
1516  const Halfedge& deref(HalfedgeHandle _h) const { return halfedge(_h); }
1517  Halfedge& deref(HalfedgeHandle _h) { return halfedge(_h); }
1518  const Edge& deref(EdgeHandle _h) const { return edge(_h); }
1519  Edge& deref(EdgeHandle _h) { return edge(_h); }
1520  const Face& deref(FaceHandle _h) const { return face(_h); }
1521  Face& deref(FaceHandle _h) { return face(_h); }
1523 
1524 protected:
1526  void collapse_edge(HalfedgeHandle _hh);
1528  void collapse_loop(HalfedgeHandle _hh);
1529 
1530 
1531 
1532 private: // Working storage for add_face()
1534  {
1535  HalfedgeHandle halfedge_handle;
1536  bool is_new;
1537  bool needs_adjust;
1538  };
1539  std::vector<AddFaceEdgeInfo> edgeData_; //
1540  std::vector<std::pair<HalfedgeHandle, HalfedgeHandle> > next_cache_; // cache for set_next_halfedge and vertex' set_halfedge
1541 
1542 };
1543 
1544 template <>
1546 {
1547  using Range = ConstVertexRange;
1549 };
1550 
1551 template <>
1553 {
1554  using Range = ConstHalfedgeRange;
1556 };
1557 
1558 template <>
1560 {
1561  using Range = ConstEdgeRange;
1563 };
1564 
1565 template <>
1567 {
1568  using Range = ConstFaceRange;
1570 };
1571 
1572 }//namespace OpenMesh
1573 
1574 #include <OpenMesh/Core/Mesh/PolyConnectivity_inline_impl.hh>
1575 
1576 #endif//OPENMESH_POLYCONNECTIVITY_HH
Iterators::GenericCirculatorT< VertexEdgeTraits, false > VertexEdgeCCWIter
Handle for a edge entity.
Definition: Handles.hh:134
Handle for a face entity.
Definition: Handles.hh:141
HalfedgeHandle HHandle
Alias typedef.
FaceHalfedgeIter ConstFaceHalfedgeIter
ConstEdgeIter CEIter
Alias typedef.
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstVertexIter, &PolyConnectivity::vertices_sbegin, &PolyConnectivity::vertices_end > > ConstVertexRangeSkipping
VertexIter ConstVertexIter
Linear iterator.
FaceFaceCCWIter ConstFaceFaceCCWIter
VertexIter vertices_end()
End iterator for vertices.
ConstFaceEdgeIter cfe_end(FaceHandle _fh) const
const face - edge circulator
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexEdgeIter, VertexHandle, EdgeHandle, &PolyConnectivity::cve_begin, &PolyConnectivity::cve_end > > ConstVertexEdgeRange
FaceHandle FHandle
Alias typedef.
ConstVertexOHalfedgeCCWIter CVOHCCWIter
Alias typedef.
FaceHalfedgeCWIter ConstFaceHalfedgeCWIter
ConstFaceVertexIter cfv_begin(FaceHandle _fh) const
const face - vertex circulator
ConstVertexEdgeCWIter CVECWIter
Alias typedef.
Iterators::GenericCirculatorT_DEPRECATED< FaceFaceTraits > FaceFaceIter
Iterators::GenericCirculatorT_DEPRECATED< VertexOppositeHalfedgeTraits > VertexIHalfedgeIter
HalfedgeLoopIter ConstHalfedgeLoopIter
ConstVertexOHalfedgeIter CVOHIter
Alias typedef.
EdgeIter EIter
Alias typedef.
VertexVertexCWIter ConstVertexVertexCWIter
VertexOHalfedgeIter ConstVertexOHalfedgeIter
VertexOHalfedgeCWIter ConstVertexOHalfedgeCWIter
ConstFaceIter CFIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeIter, FaceHandle, EdgeHandle, &PolyConnectivity::cfe_begin, &PolyConnectivity::cfe_end > > ConstFaceEdgeRange
Iterators::GenericCirculatorT_DEPRECATED< FaceEdgeTraits > FaceEdgeIter
Handle for a halfedge entity.
Definition: Handles.hh:127
VertexFaceCWIter ConstVertexFaceCWIter
EdgeHandle EHandle
Alias typedef.
Iterators::GenericCirculatorT< VertexFaceTraits, true > VertexFaceCWIter
FaceIter faces_begin()
Begin iterator for faces.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceIter, FaceHandle, FaceHandle, &PolyConnectivity::cff_begin, &PolyConnectivity::cff_end > > ConstFaceFaceRange
VertexVertexIter VVIter
Alias typedef.
Edge & deref(EdgeHandle _h)
Get item from handle.
VertexIHalfedgeCCWIter ConstVertexIHalfedgeCCWIter
Iterators::GenericCirculatorT< FaceHalfedgeTraits, true > HalfedgeLoopCCWIter
VertexFaceCWIter VFCWIter
Alias typedef.
HalfedgeLoopCWIter ConstHalfedgeLoopCWIter
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstHalfedgeIter, &PolyConnectivity::halfedges_begin, &PolyConnectivity::halfedges_end > > ConstHalfedgeRange
ConstFaceHalfedgeIter cfh_begin(FaceHandle _fh) const
const face - halfedge circulator
void assign_connectivity(const PolyConnectivity &_other)
ConstVertexOHalfedgeCWIter CVOHCWIter
Alias typedef.
FaceEdgeCWIter FECWIter
Alias typedef.
VertexIHalfedgeCWIter VIHICWter
Alias typedef.
VertexIHalfedgeCCWIter VIHICCWter
Alias typedef.
FaceIter faces_end()
End iterator for faces.
bool is_boundary(VertexHandle _vh) const
Is vertex _vh a boundary vertex ?
VertexOHalfedgeCCWIter ConstVertexOHalfedgeCCWIter
ConstFaceFaceIter CFFIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexVertexCWIter, VertexHandle, VertexHandle, &PolyConnectivity::cvv_cwbegin, &PolyConnectivity::cvv_cwend > > ConstVertexVertexRange
Handle for a vertex entity.
Definition: Handles.hh:120
VertexEdgeCCWIter ConstVertexEdgeCCWIter
ConstFaceEdgeCWIter CFECWIter
Alias typedef.
ConstFaceEdgeIter cfe_begin(FaceHandle _fh) const
const face - edge circulator
bool is_valid() const
The handle is valid iff the index is not negative.
Definition: Handles.hh:72
FaceHalfedgeIter FHIter
Alias typedef.
bool is_boundary(HalfedgeHandle _heh) const
Is halfedge _heh a boundary halfedge (is its face handle invalid) ?
Definition: ArrayKernel.hh:398
VertexIHalfedgeIter ConstVertexIHalfedgeIter
Iterators::GenericCirculatorT_DEPRECATED< FaceVertexTraits > FaceVertexIter
Iterators::GenericCirculatorT< FaceFaceTraits, true > FaceFaceCCWIter
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstVertexIter, &PolyConnectivity::vertices_begin, &PolyConnectivity::vertices_end > > ConstVertexRange
FaceFaceIter FFIter
Alias typedef.
FaceVertexCCWIter FVCCWIter
Alias typedef.
ConstFaceHalfedgeCCWIter CFHCCWIter
Alias typedef.
EdgeIter edges_end()
End iterator for edges.
Iterators::GenericCirculatorT< VertexFaceTraits, false > VertexFaceCCWIter
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstFaceIter, &PolyConnectivity::faces_begin, &PolyConnectivity::faces_end > > ConstFaceRange
HalfedgeLoopCCWIter ConstHalfedgeLoopCCWIter
Iterators::GenericIteratorT< This, This::EdgeHandle, ArrayKernel, &ArrayKernel::has_edge_status, &ArrayKernel::n_edges > EdgeIter
Linear iterator.
const Face & deref(FaceHandle _h) const
Get item from handle.
ConstFaceVertexIter cfv_end(FaceHandle _fh) const
const face - vertex circulator
ConstVertexVertexCWIter cvv_cwbegin(VertexHandle _vh) const
const vertex circulator cw
Vertex & deref(VertexHandle _h)
Get item from handle.
Iterators::GenericIteratorT< This, This::FaceHandle, ArrayKernel, &ArrayKernel::has_face_status, &ArrayKernel::n_faces > FaceIter
Linear iterator.
FaceIter faces_sbegin()
Begin iterator for faces.
VertexOHalfedgeCCWIter VOHCCWIter
Alias typedef.
HalfedgeIter halfedges_sbegin()
Begin iterator for halfedges.
void assign_connectivity(const ArrayKernel &_other)
Definition: ArrayKernel.cc:71
ConstVertexVertexCWIter cvv_cwend(VertexHandle _vh) const
const vertex circulator cw
VertexIHalfedgeIter VIHIter
Alias typedef.
VertexVertexCCWIter VVCCWIter
Alias typedef.
Iterators::GenericCirculatorT< FaceHalfedgeTraits, false > HalfedgeLoopCWIter
Iterators::GenericCirculatorT< VertexEdgeTraits, true > VertexEdgeCWIter
ConstVertexIHalfedgeCWIter CVIHCWIter
Alias typedef.
ConstVertexFaceIter cvf_begin(VertexHandle _vh) const
const vertex - face circulator
VertexIter VIter
Alias typedef.
Iterators::GenericCirculatorT_DEPRECATED< FaceHalfedgeTraits > HalfedgeLoopIter
VertexVertexIter ConstVertexVertexIter
VertexEdgeIter VEIter
Alias typedef.
FaceIter FIter
Alias typedef.
FaceEdgeIter FEIter
Alias typedef.
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstFaceIter, &PolyConnectivity::faces_sbegin, &PolyConnectivity::faces_end > > ConstFaceRangeSkipping
Iterators::GenericCirculatorT< VertexHalfedgeTraits, false > VertexOHalfedgeCCWIter
FaceVertexIter FVIter
Alias typedef.
VertexFaceIter VFIter
Alias typedef.
Iterators::GenericCirculatorT_DEPRECATED< VertexVertexTraits > VertexVertexIter
ConstVertexVertexCCWIter CVVCCWIter
Alias typedef.
bool is_boundary(HalfedgeHandle _heh) const
Check if the halfedge is at the boundary.
ConstVertexIHalfedgeIter CVIHIter
Alias typedef.
VertexOHalfedgeCWIter VOHCWIter
Alias typedef.
Generic class for iterator ranges.
ConstFaceHalfedgeCWIter CFHCWIter
Alias typedef.
ConstVertexEdgeIter cve_end(VertexHandle _vh) const
const vertex - edge circulator
VertexVertexCWIter VVCWIter
Alias typedef.
ConstFaceHalfedgeIter cfh_end(FaceHandle _fh) const
const face - halfedge circulator
HalfedgeIter halfedges_begin()
Begin iterator for halfedges.
ConstVertexOHalfedgeIter cvoh_begin(VertexHandle _vh) const
const vertex - outgoing halfedge circulator
Halfedge & deref(HalfedgeHandle _h)
Get item from handle.
ConstFaceFaceCCWIter CFFCCWIter
Alias typedef.
Iterators::GenericCirculatorT_DEPRECATED< VertexFaceTraits > VertexFaceIter
VertexEdgeCWIter VECWIter
Alias typedef.
Iterators::GenericIteratorT< This, This::HalfedgeHandle, ArrayKernel, &ArrayKernel::has_halfedge_status, &ArrayKernel::n_halfedges > HalfedgeIter
Linear iterator.
ConstFaceEdgeCCWIter CFECCWIter
Alias typedef.
Iterators::GenericCirculatorT< FaceVertexTraits, false > FaceVertexCWIter
FaceEdgeCCWIter FECWWIter
Alias typedef.
Iterators::GenericCirculatorT< FaceEdgeTraits, true > FaceEdgeCCWIter
Face & deref(FaceHandle _h)
Get item from handle.
ConstFaceVertexCWIter CFVCWIter
Alias typedef.
FaceVertexCWIter FVCWIter
Alias typedef.
ConstFaceVertexIter CFVIter
Alias typedef.
VertexOHalfedgeIter VOHIter
Alias typedef.
ConstVertexVertexCWIter CVVCWIter
Alias typedef.
FaceHalfedgeCCWIter FHCWWIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexIHalfedgeIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvih_begin, &PolyConnectivity::cvih_end > > ConstVertexIHalfedgeRange
Iterators::GenericCirculatorT_DEPRECATED< FaceHalfedgeTraits > FaceHalfedgeIter
Iterators::GenericCirculatorT< VertexOppositeHalfedgeTraits, true > VertexIHalfedgeCWIter
Iterators::GenericCirculatorT< FaceHalfedgeTraits, false > FaceHalfedgeCWIter
ConstHalfedgeIter CHIter
Alias typedef.
ConstVertexIter CVIter
Alias typedef.
FaceIter ConstFaceIter
Linear iterator.
Generic class for vertex/halfedge/edge/face ranges.
ConstVertexIHalfedgeCCWIter CVIHCCWIter
Alias typedef.
HalfedgeIter ConstHalfedgeIter
Linear iterator.
ConstVertexEdgeIter cve_begin(VertexHandle _vh) const
const vertex - edge circulator
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstEdgeIter, &PolyConnectivity::edges_begin, &PolyConnectivity::edges_end > > ConstEdgeRange
ConstVertexEdgeCCWIter CVECCWIter
Alias typedef.
Iterators::GenericCirculatorT< FaceHalfedgeTraits, true > FaceHalfedgeCCWIter
VertexFaceCCWIter VFCCWIter
Alias typedef.
VertexIter vertices_begin()
Begin iterator for vertices.
VertexIHalfedgeCWIter ConstVertexIHalfedgeCWIter
FaceHalfedgeCWIter FHCWIter
Alias typedef.
VertexVertexCCWIter ConstVertexVertexCCWIter
Iterators::GenericCirculatorT< FaceVertexTraits, true > FaceVertexCCWIter
Smart version of VertexHandle contains a pointer to the corresponding mesh and allows easier access t...
Definition: SmartHandles.hh:84
Iterators::GenericCirculatorT< VertexHalfedgeTraits, true > VertexOHalfedgeCWIter
ConstVertexEdgeIter CVEIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexFaceIter, VertexHandle, FaceHandle, &PolyConnectivity::cvf_begin, &PolyConnectivity::cvf_end > > ConstVertexFaceRange
FaceVertexCWIter ConstFaceVertexCWIter
EdgeIter ConstEdgeIter
Linear iterator.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceVertexIter, FaceHandle, VertexHandle, &PolyConnectivity::cfv_begin, &PolyConnectivity::cfv_end > > ConstFaceVertexRange
Iterators::GenericCirculatorT< FaceEdgeTraits, false > FaceEdgeCWIter
ConstFaceFaceIter cff_begin(FaceHandle _fh) const
const face - face circulator
VertexIter vertices_sbegin()
Begin iterator for vertices.
HalfedgeIter halfedges_end()
End iterator for halfedges.
ConstFaceVertexCCWIter CFVCCWIter
Alias typedef.
static const HalfedgeHandle InvalidHalfedgeHandle
Invalid handle.
static const EdgeHandle InvalidEdgeHandle
Invalid handle.
ConstVertexFaceIter CVFIter
Alias typedef.
ConstFaceFaceCWIter CFFCWIter
Alias typedef.
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstHalfedgeIter, &PolyConnectivity::halfedges_sbegin, &PolyConnectivity::halfedges_end > > ConstHalfedgeRangeSkipping
FaceEdgeCCWIter ConstFaceEdgeCCWIter
Iterators::GenericCirculatorT_DEPRECATED< VertexEdgeTraits > VertexEdgeIter
Connectivity Class for polygonal meshes.
ConstVertexFaceIter cvf_end(VertexHandle _vh) const
const vertex - face circulator
ConstVertexIHalfedgeIter cvih_end(VertexHandle _vh) const
const vertex - incoming halfedge circulator
VertexEdgeCCWIter VECCWIter
Alias typedef.
FaceVertexCCWIter ConstFaceVertexCCWIter
VertexFaceCCWIter ConstVertexFaceCCWIter
static const FaceHandle InvalidFaceHandle
Invalid handle.
ConstVertexFaceCCWIter CVFCCWIter
Alias typedef.
Iterators::GenericCirculatorT< FaceFaceTraits, false > FaceFaceCWIter
ConstFaceHalfedgeIter CFHIter
Alias typedef.
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstEdgeIter, &PolyConnectivity::edges_sbegin, &PolyConnectivity::edges_end > > ConstEdgeRangeSkipping
ConstVertexFaceCWIter CVFCWIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexOHalfedgeIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvoh_begin, &PolyConnectivity::cvoh_end > > ConstVertexOHalfedgeRange
EdgeIter edges_sbegin()
Begin iterator for edges.
ConstVertexVertexIter CVVIter
Alias typedef.
const Halfedge & deref(HalfedgeHandle _h) const
Get item from handle.
Iterators::GenericCirculatorT< VertexOppositeHalfedgeTraits, false > VertexIHalfedgeCCWIter
Iterators::GenericCirculatorT_DEPRECATED< VertexHalfedgeTraits > VertexOHalfedgeIter
EdgeIter edges_begin()
Begin iterator for edges.
ConstFaceEdgeIter CFEIter
Alias typedef.
ConstFaceFaceIter cff_end(FaceHandle _fh) const
const face - face circulator
ConstVertexOHalfedgeIter cvoh_end(VertexHandle _vh) const
const vertex - outgoing halfedge circulator
bool is_boundary(EdgeHandle _eh) const
Is the edge a boundary edge?
FaceHalfedgeCCWIter ConstFaceHalfedgeCCWIter
HalfedgeIter HIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceHalfedgeIter, FaceHandle, HalfedgeHandle, &PolyConnectivity::cfh_begin, &PolyConnectivity::cfh_end > > ConstFaceHalfedgeRange
Iterators::GenericCirculatorT< VertexVertexTraits, true > VertexVertexCWIter
Iterators::GenericCirculatorT< VertexVertexTraits, false > VertexVertexCCWIter
FaceHandle opposite_face_handle(HalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
VertexEdgeCWIter ConstVertexEdgeCWIter
ConstVertexIHalfedgeIter cvih_begin(VertexHandle _vh) const
const vertex - incoming halfedge circulator
const Edge & deref(EdgeHandle _h) const
Get item from handle.