Developer Documentation
PolyConnectivity.hh
1/* ========================================================================= *
2 * *
3 * OpenMesh *
4 * Copyright (c) 2001-2025, 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
50namespace OpenMesh
51{
52
53namespace 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
68template <typename RangeTraitT>
69class EntityRange;
70
71template<
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
85template <typename CirculatorRangeTraitT>
86class CirculatorRange;
87
88template<
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 begin(const CONTAINER_TYPE& _container, HalfedgeHandle _heh, int) { return ITER_TYPE(_container, _heh); }
103 static ITER_TYPE end(const CONTAINER_TYPE& _container, CENTER_ENTITY_TYPE _ce) { return (_container.*end_fn)(_ce); }
104 static ITER_TYPE end(const CONTAINER_TYPE& _container, HalfedgeHandle _heh, int) { return ITER_TYPE(_container, _heh, true); }
105};
106
107struct SmartVertexHandle;
109struct SmartEdgeHandle;
110struct SmartFaceHandle;
111
114class OPENMESHDLLEXPORT PolyConnectivity : public ArrayKernel
115{
116public:
118
119
128
130
131 //--- iterators ---
132
143
149
150 //--- circulators ---
151
157
158 /*
159 * Vertex-centered circulators
160 */
161
163 {
164 using Mesh = This;
167 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return _mesh->to_vertex_handle(_heh);}
168 };
169
170
176
181
182
184 {
185 using Mesh = This;
188 static ValueHandle toHandle(const Mesh* const /*_mesh*/, This::HalfedgeHandle _heh) { return _heh;}
189 };
190
196
201
203 {
204 using Mesh = This;
207 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return _mesh->opposite_halfedge_handle(_heh); }
208 };
209
215
220
221
223 {
224 using Mesh = This;
227 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->face_handle(_heh); }
228 };
229
235
240
241
243 {
244 using Mesh = This;
247 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->edge_handle(_heh); }
248 };
249
259
260
262 {
263 using Mesh = This;
266 static ValueHandle toHandle(const Mesh* const /*_mesh*/, This::HalfedgeHandle _heh) { return _heh; }
267 };
268
278
294
295 /*
296 * Face-centered circulators
297 */
298
300 {
301 using Mesh = This;
304 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->to_vertex_handle(_heh); }
305 };
306
312
317
323
328
329
331 {
332 using Mesh = This;
335 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->edge_handle(_heh); }
336 };
337
343
348
349
351 {
352 using Mesh = This;
355 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->face_handle(_mesh->opposite_halfedge_handle(_heh)); }
356 };
357
363
368
381
382 /*
383 * Edge-centered circulators
384 */
385
387 {
388 using Mesh = This;
391 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->from_vertex_handle(_heh); }
392 };
393
398
400 {
401 using Mesh = This;
404 static ValueHandle toHandle(const Mesh* const /* _mesh */, This::HalfedgeHandle _heh) { return _heh; }
405 };
406
411
413 {
414 using Mesh = This;
417 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->face_handle(_heh); }
418 };
419
424
428
429 /*
430 * Halfedge circulator
431 */
435
437
438 // --- shortcuts
439
449
454
459
488
520
521public:
522
524 virtual ~PolyConnectivity() {}
525
526 inline static bool is_triangles()
527 { return false; }
528
531 inline void assign_connectivity(const PolyConnectivity& _other)
533
537
539 inline SmartVertexHandle add_vertex();
540
548 SmartFaceHandle add_face(const std::vector<VertexHandle>& _vhandles);
549
557 SmartFaceHandle add_face(const std::vector<SmartVertexHandle>& _vhandles);
558
559
569 SmartFaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2);
570
581 SmartFaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2, VertexHandle _vh3);
582
591 SmartFaceHandle add_face(const VertexHandle* _vhandles, size_t _vhs_size);
592
594
596
597
602 bool is_collapse_ok(HalfedgeHandle _he);
603
604
610 void delete_vertex(VertexHandle _vh, bool _delete_isolated_vertices = true);
611
620 void delete_edge(EdgeHandle _eh, bool _delete_isolated_vertices=true);
621
632 void delete_face(FaceHandle _fh, bool _delete_isolated_vertices=true);
633
634
636
640
641 using ArrayKernel::next_halfedge_handle;
642 using ArrayKernel::prev_halfedge_handle;
643 using ArrayKernel::opposite_halfedge_handle;
644 using ArrayKernel::ccw_rotated_halfedge_handle;
645 using ArrayKernel::cw_rotated_halfedge_handle;
646
647 inline SmartHalfedgeHandle next_halfedge_handle (SmartHalfedgeHandle _heh) const;
648 inline SmartHalfedgeHandle prev_halfedge_handle (SmartHalfedgeHandle _heh) const;
649 inline SmartHalfedgeHandle opposite_halfedge_handle (SmartHalfedgeHandle _heh) const;
650 inline SmartHalfedgeHandle ccw_rotated_halfedge_handle(SmartHalfedgeHandle _heh) const;
651 inline SmartHalfedgeHandle cw_rotated_halfedge_handle (SmartHalfedgeHandle _heh) const;
652
653 using ArrayKernel::s_halfedge_handle;
654 using ArrayKernel::s_edge_handle;
655
656 static SmartHalfedgeHandle s_halfedge_handle(SmartEdgeHandle _eh, unsigned int _i = 0);
657 static SmartEdgeHandle s_edge_handle(SmartHalfedgeHandle _heh);
658
659 using ArrayKernel::halfedge_handle;
660 using ArrayKernel::edge_handle;
661 using ArrayKernel::face_handle;
662
663 inline SmartHalfedgeHandle halfedge_handle(SmartEdgeHandle _eh, unsigned int _i = 0) const;
664 inline SmartHalfedgeHandle halfedge_handle(SmartFaceHandle _fh) const;
665 inline SmartHalfedgeHandle halfedge_handle(SmartVertexHandle _vh) const;
666 inline SmartEdgeHandle edge_handle(SmartHalfedgeHandle _heh) const;
667 inline SmartFaceHandle face_handle(SmartHalfedgeHandle _heh) const;
668
670 inline SmartFaceHandle opposite_face_handle(HalfedgeHandle _heh) const;
671
673
677
679 VertexIter vertices_begin();
681 ConstVertexIter vertices_begin() const;
683 VertexIter vertices_end();
685 ConstVertexIter vertices_end() const;
686
688 HalfedgeIter halfedges_begin();
690 ConstHalfedgeIter halfedges_begin() const;
692 HalfedgeIter halfedges_end();
694 ConstHalfedgeIter halfedges_end() const;
695
697 EdgeIter edges_begin();
699 ConstEdgeIter edges_begin() const;
701 EdgeIter edges_end();
703 ConstEdgeIter edges_end() const;
704
706 FaceIter faces_begin();
708 ConstFaceIter faces_begin() const;
710 FaceIter faces_end();
712 ConstFaceIter faces_end() const;
714
715
719
721 VertexIter vertices_sbegin();
723 ConstVertexIter vertices_sbegin() const;
724
726 HalfedgeIter halfedges_sbegin();
728 ConstHalfedgeIter halfedges_sbegin() const;
729
731 EdgeIter edges_sbegin();
733 ConstEdgeIter edges_sbegin() const;
734
736 FaceIter faces_sbegin();
738 ConstFaceIter faces_sbegin() const;
739
741
742 //--- circulators ---
743
747
749 VertexVertexIter vv_iter(VertexHandle _vh);
751 VertexVertexCWIter vv_cwiter(VertexHandle _vh);
753 VertexVertexCCWIter vv_ccwiter(VertexHandle _vh);
755 VertexIHalfedgeIter vih_iter(VertexHandle _vh);
757 VertexIHalfedgeCWIter vih_cwiter(VertexHandle _vh);
759 VertexIHalfedgeCCWIter vih_ccwiter(VertexHandle _vh);
761 VertexOHalfedgeIter voh_iter(VertexHandle _vh);
763 VertexOHalfedgeCWIter voh_cwiter(VertexHandle _vh);
765 VertexOHalfedgeCCWIter voh_ccwiter(VertexHandle _vh);
767 VertexEdgeIter ve_iter(VertexHandle _vh);
769 VertexEdgeCWIter ve_cwiter(VertexHandle _vh);
771 VertexEdgeCCWIter ve_ccwiter(VertexHandle _vh);
773 VertexFaceIter vf_iter(VertexHandle _vh);
775 VertexFaceCWIter vf_cwiter(VertexHandle _vh);
777 VertexFaceCCWIter vf_ccwiter(VertexHandle _vh);
778
780 ConstVertexVertexIter cvv_iter(VertexHandle _vh) const;
782 ConstVertexVertexCWIter cvv_cwiter(VertexHandle _vh) const;
784 ConstVertexVertexCCWIter cvv_ccwiter(VertexHandle _vh) const;
786 ConstVertexIHalfedgeIter cvih_iter(VertexHandle _vh) const;
788 ConstVertexIHalfedgeCWIter cvih_cwiter(VertexHandle _vh) const;
790 ConstVertexIHalfedgeCCWIter cvih_ccwiter(VertexHandle _vh) const;
792 ConstVertexOHalfedgeIter cvoh_iter(VertexHandle _vh) const;
794 ConstVertexOHalfedgeCWIter cvoh_cwiter(VertexHandle _vh) const;
796 ConstVertexOHalfedgeCCWIter cvoh_ccwiter(VertexHandle _vh) const;
798 ConstVertexEdgeIter cve_iter(VertexHandle _vh) const;
800 ConstVertexEdgeCWIter cve_cwiter(VertexHandle _vh) const;
802 ConstVertexEdgeCCWIter cve_ccwiter(VertexHandle _vh) const;
804 ConstVertexFaceIter cvf_iter(VertexHandle _vh) const;
806 ConstVertexFaceCWIter cvf_cwiter(VertexHandle _vh) const;
808 ConstVertexFaceCCWIter cvf_ccwiter(VertexHandle _vh) const;
809
811 FaceVertexIter fv_iter(FaceHandle _fh);
813 FaceVertexCWIter fv_cwiter(FaceHandle _fh);
815 FaceVertexCCWIter fv_ccwiter(FaceHandle _fh);
817 FaceHalfedgeIter fh_iter(FaceHandle _fh);
819 FaceHalfedgeCWIter fh_cwiter(FaceHandle _fh);
821 FaceHalfedgeCCWIter fh_ccwiter(FaceHandle _fh);
823 FaceEdgeIter fe_iter(FaceHandle _fh);
825 FaceEdgeCWIter fe_cwiter(FaceHandle _fh);
827 FaceEdgeCCWIter fe_ccwiter(FaceHandle _fh);
829 FaceFaceIter ff_iter(FaceHandle _fh);
831 FaceFaceCWIter ff_cwiter(FaceHandle _fh);
833 FaceFaceCCWIter ff_ccwiter(FaceHandle _fh);
834
836 ConstFaceVertexIter cfv_iter(FaceHandle _fh) const;
838 ConstFaceVertexCWIter cfv_cwiter(FaceHandle _fh) const;
840 ConstFaceVertexCCWIter cfv_ccwiter(FaceHandle _fh) const;
842 ConstFaceHalfedgeIter cfh_iter(FaceHandle _fh) const;
844 ConstFaceHalfedgeCWIter cfh_cwiter(FaceHandle _fh) const;
846 ConstFaceHalfedgeCCWIter cfh_ccwiter(FaceHandle _fh) const;
848 ConstFaceEdgeIter cfe_iter(FaceHandle _fh) const;
850 ConstFaceEdgeCWIter cfe_cwiter(FaceHandle _fh) const;
852 ConstFaceEdgeCCWIter cfe_ccwiter(FaceHandle _fh) const;
854 ConstFaceFaceIter cff_iter(FaceHandle _fh) const;
856 ConstFaceFaceCWIter cff_cwiter(FaceHandle _fh) const;
858 ConstFaceFaceCCWIter cff_ccwiter(FaceHandle _fh) const;
859
861 EdgeVertexIter ev_iter(EdgeHandle _eh);
863 EdgeHalfedgeIter eh_iter(EdgeHandle _eh);
865 EdgeFaceIter ef_iter(EdgeHandle _eh);
866
868 ConstEdgeVertexIter cev_iter(EdgeHandle _eh) const;
870 ConstEdgeHalfedgeIter ceh_iter(EdgeHandle _eh) const;
872 ConstEdgeFaceIter cef_iter(EdgeHandle _eh) const;
873
874 // 'begin' circulators
875
877 VertexVertexIter vv_begin(VertexHandle _vh);
879 VertexVertexCWIter vv_cwbegin(VertexHandle _vh);
881 VertexVertexCCWIter vv_ccwbegin(VertexHandle _vh);
883 VertexIHalfedgeIter vih_begin(VertexHandle _vh);
885 VertexIHalfedgeCWIter vih_cwbegin(VertexHandle _vh);
887 VertexIHalfedgeCCWIter vih_ccwbegin(VertexHandle _vh);
889 VertexOHalfedgeIter voh_begin(VertexHandle _vh);
891 VertexOHalfedgeCWIter voh_cwbegin(VertexHandle _vh);
893 VertexOHalfedgeCCWIter voh_ccwbegin(VertexHandle _vh);
895 VertexEdgeIter ve_begin(VertexHandle _vh);
897 VertexEdgeCWIter ve_cwbegin(VertexHandle _vh);
899 VertexEdgeCCWIter ve_ccwbegin(VertexHandle _vh);
901 VertexFaceIter vf_begin(VertexHandle _vh);
903 VertexFaceCWIter vf_cwbegin(VertexHandle _vh);
905 VertexFaceCCWIter vf_ccwbegin(VertexHandle _vh);
906
907
909 ConstVertexVertexIter cvv_begin(VertexHandle _vh) const;
911 ConstVertexVertexCWIter cvv_cwbegin(VertexHandle _vh) const;
913 ConstVertexVertexCCWIter cvv_ccwbegin(VertexHandle _vh) const;
915 ConstVertexIHalfedgeIter cvih_begin(VertexHandle _vh) const;
917 ConstVertexIHalfedgeCWIter cvih_cwbegin(VertexHandle _vh) const;
919 ConstVertexIHalfedgeCCWIter cvih_ccwbegin(VertexHandle _vh) const;
921 ConstVertexOHalfedgeIter cvoh_begin(VertexHandle _vh) const;
923 ConstVertexOHalfedgeCWIter cvoh_cwbegin(VertexHandle _vh) const;
925 ConstVertexOHalfedgeCCWIter cvoh_ccwbegin(VertexHandle _vh) const;
927 ConstVertexEdgeIter cve_begin(VertexHandle _vh) const;
929 ConstVertexEdgeCWIter cve_cwbegin(VertexHandle _vh) const;
931 ConstVertexEdgeCCWIter cve_ccwbegin(VertexHandle _vh) const;
933 ConstVertexFaceIter cvf_begin(VertexHandle _vh) const;
935 ConstVertexFaceCWIter cvf_cwbegin(VertexHandle _vh) const;
937 ConstVertexFaceCCWIter cvf_ccwbegin(VertexHandle _vh) const;
938
940 FaceVertexIter fv_begin(FaceHandle _fh);
942 FaceVertexCWIter fv_cwbegin(FaceHandle _fh);
944 FaceVertexCCWIter fv_ccwbegin(FaceHandle _fh);
946 FaceHalfedgeIter fh_begin(FaceHandle _fh);
948 FaceHalfedgeCWIter fh_cwbegin(FaceHandle _fh);
950 FaceHalfedgeCCWIter fh_ccwbegin(FaceHandle _fh);
952 FaceEdgeIter fe_begin(FaceHandle _fh);
954 FaceEdgeCWIter fe_cwbegin(FaceHandle _fh);
956 FaceEdgeCCWIter fe_ccwbegin(FaceHandle _fh);
958 FaceFaceIter ff_begin(FaceHandle _fh);
960 FaceFaceCWIter ff_cwbegin(FaceHandle _fh);
962 FaceFaceCCWIter ff_ccwbegin(FaceHandle _fh);
964 HalfedgeLoopIter hl_begin(HalfedgeHandle _heh);
966 HalfedgeLoopCWIter hl_cwbegin(HalfedgeHandle _heh);
968 HalfedgeLoopCCWIter hl_ccwbegin(HalfedgeHandle _heh);
969
971 ConstFaceVertexIter cfv_begin(FaceHandle _fh) const;
973 ConstFaceVertexCWIter cfv_cwbegin(FaceHandle _fh) const;
975 ConstFaceVertexCCWIter cfv_ccwbegin(FaceHandle _fh) const;
977 ConstFaceHalfedgeIter cfh_begin(FaceHandle _fh) const;
979 ConstFaceHalfedgeCWIter cfh_cwbegin(FaceHandle _fh) const;
981 ConstFaceHalfedgeCCWIter cfh_ccwbegin(FaceHandle _fh) const;
983 ConstFaceEdgeIter cfe_begin(FaceHandle _fh) const;
985 ConstFaceEdgeCWIter cfe_cwbegin(FaceHandle _fh) const;
987 ConstFaceEdgeCCWIter cfe_ccwbegin(FaceHandle _fh) const;
989 ConstFaceFaceIter cff_begin(FaceHandle _fh) const;
991 ConstFaceFaceCWIter cff_cwbegin(FaceHandle _fh) const;
993 ConstFaceFaceCCWIter cff_ccwbegin(FaceHandle _fh) const;
995 ConstHalfedgeLoopIter chl_begin(HalfedgeHandle _heh) const;
997 ConstHalfedgeLoopCWIter chl_cwbegin(HalfedgeHandle _heh) const;
999 ConstHalfedgeLoopCCWIter chl_ccwbegin(HalfedgeHandle _heh) const;
1000
1002 EdgeVertexIter ev_begin(EdgeHandle _eh);
1004 EdgeHalfedgeIter eh_begin(EdgeHandle _eh);
1006 EdgeFaceIter ef_begin(EdgeHandle _eh);
1007
1009 ConstEdgeVertexIter cev_begin(EdgeHandle _eh) const;
1011 ConstEdgeHalfedgeIter ceh_begin(EdgeHandle _eh) const;
1013 ConstEdgeFaceIter cef_begin(EdgeHandle _eh) const;
1014
1015 // 'end' circulators
1016
1018 VertexVertexIter vv_end(VertexHandle _vh);
1020 VertexVertexCWIter vv_cwend(VertexHandle _vh);
1022 VertexVertexCCWIter vv_ccwend(VertexHandle _vh);
1024 VertexIHalfedgeIter vih_end(VertexHandle _vh);
1026 VertexIHalfedgeCWIter vih_cwend(VertexHandle _vh);
1028 VertexIHalfedgeCCWIter vih_ccwend(VertexHandle _vh);
1030 VertexOHalfedgeIter voh_end(VertexHandle _vh);
1032 VertexOHalfedgeCWIter voh_cwend(VertexHandle _vh);
1034 VertexOHalfedgeCCWIter voh_ccwend(VertexHandle _vh);
1036 VertexEdgeIter ve_end(VertexHandle _vh);
1038 VertexEdgeCWIter ve_cwend(VertexHandle _vh);
1040 VertexEdgeCCWIter ve_ccwend(VertexHandle _vh);
1042 VertexFaceIter vf_end(VertexHandle _vh);
1044 VertexFaceCWIter vf_cwend(VertexHandle _vh);
1046 VertexFaceCCWIter vf_ccwend(VertexHandle _vh);
1047
1049 ConstVertexVertexIter cvv_end(VertexHandle _vh) const;
1051 ConstVertexVertexCWIter cvv_cwend(VertexHandle _vh) const;
1053 ConstVertexVertexCCWIter cvv_ccwend(VertexHandle _vh) const;
1055 ConstVertexIHalfedgeIter cvih_end(VertexHandle _vh) const;
1057 ConstVertexIHalfedgeCWIter cvih_cwend(VertexHandle _vh) const;
1059 ConstVertexIHalfedgeCCWIter cvih_ccwend(VertexHandle _vh) const;
1061 ConstVertexOHalfedgeIter cvoh_end(VertexHandle _vh) const;
1063 ConstVertexOHalfedgeCWIter cvoh_cwend(VertexHandle _vh) const;
1065 ConstVertexOHalfedgeCCWIter cvoh_ccwend(VertexHandle _vh) const;
1067 ConstVertexEdgeIter cve_end(VertexHandle _vh) const;
1069 ConstVertexEdgeCWIter cve_cwend(VertexHandle _vh) const;
1071 ConstVertexEdgeCCWIter cve_ccwend(VertexHandle _vh) const;
1073 ConstVertexFaceIter cvf_end(VertexHandle _vh) const;
1075 ConstVertexFaceCWIter cvf_cwend(VertexHandle _vh) const;
1077 ConstVertexFaceCCWIter cvf_ccwend(VertexHandle _vh) const;
1078
1080 FaceVertexIter fv_end(FaceHandle _fh);
1082 FaceVertexCWIter fv_cwend(FaceHandle _fh);
1084 FaceVertexCCWIter fv_ccwend(FaceHandle _fh);
1086 FaceHalfedgeIter fh_end(FaceHandle _fh);
1088 FaceHalfedgeCWIter fh_cwend(FaceHandle _fh);
1090 FaceHalfedgeCCWIter fh_ccwend(FaceHandle _fh);
1092 FaceEdgeIter fe_end(FaceHandle _fh);
1094 FaceEdgeCWIter fe_cwend(FaceHandle _fh);
1096 FaceEdgeCCWIter fe_ccwend(FaceHandle _fh);
1098 FaceFaceIter ff_end(FaceHandle _fh);
1100 FaceFaceCWIter ff_cwend(FaceHandle _fh);
1102 FaceFaceCCWIter ff_ccwend(FaceHandle _fh);
1104 HalfedgeLoopIter hl_end(HalfedgeHandle _heh);
1106 HalfedgeLoopCWIter hl_cwend(HalfedgeHandle _heh);
1108 HalfedgeLoopCCWIter hl_ccwend(HalfedgeHandle _heh);
1109
1111 ConstFaceVertexIter cfv_end(FaceHandle _fh) const;
1113 ConstFaceVertexCWIter cfv_cwend(FaceHandle _fh) const;
1115 ConstFaceVertexCCWIter cfv_ccwend(FaceHandle _fh) const;
1117 ConstFaceHalfedgeIter cfh_end(FaceHandle _fh) const;
1119 ConstFaceHalfedgeCWIter cfh_cwend(FaceHandle _fh) const;
1121 ConstFaceHalfedgeCCWIter cfh_ccwend(FaceHandle _fh) const;
1123 ConstFaceEdgeIter cfe_end(FaceHandle _fh) const;
1125 ConstFaceEdgeCWIter cfe_cwend(FaceHandle _fh) const;
1127 ConstFaceEdgeCCWIter cfe_ccwend(FaceHandle _fh) const;
1129 ConstFaceFaceIter cff_end(FaceHandle _fh) const;
1131 ConstFaceFaceCWIter cff_cwend(FaceHandle _fh) const;
1133 ConstFaceFaceCCWIter cff_ccwend(FaceHandle _fh) const;
1135 ConstHalfedgeLoopIter chl_end(HalfedgeHandle _heh) const;
1137 ConstHalfedgeLoopCWIter chl_cwend(HalfedgeHandle _heh) const;
1139 ConstHalfedgeLoopCCWIter chl_ccwend(HalfedgeHandle _heh) const;
1140
1142 EdgeVertexIter ev_end(EdgeHandle _eh);
1144 EdgeHalfedgeIter eh_end(EdgeHandle _eh);
1146 EdgeFaceIter ef_end(EdgeHandle _eh);
1147
1149 ConstEdgeVertexIter cev_end(EdgeHandle _eh) const;
1151 ConstEdgeHalfedgeIter ceh_end(EdgeHandle _eh) const;
1153 ConstEdgeFaceIter cef_end(EdgeHandle _eh) const;
1154
1156
1159
1160 typedef EntityRange<RangeTraitT<
1161 const PolyConnectivity,
1165 typedef EntityRange<RangeTraitT<
1166 const PolyConnectivity,
1170 typedef EntityRange<RangeTraitT<
1171 const PolyConnectivity,
1175 typedef EntityRange<RangeTraitT<
1176 const PolyConnectivity,
1180 typedef EntityRange<RangeTraitT<
1181 const PolyConnectivity,
1185 typedef EntityRange<RangeTraitT<
1186 const PolyConnectivity,
1190 typedef EntityRange<RangeTraitT<
1191 const PolyConnectivity,
1195 typedef EntityRange<RangeTraitT<
1196 const PolyConnectivity,
1200
1201
1202 template <typename HandleType>
1204
1209 ConstVertexRangeSkipping vertices() const;
1210
1215 ConstVertexRange all_vertices() const;
1216
1221 ConstHalfedgeRangeSkipping halfedges() const;
1222
1227 ConstHalfedgeRange all_halfedges() const;
1228
1233 ConstEdgeRangeSkipping edges() const;
1234
1239 ConstEdgeRange all_edges() const;
1240
1245 ConstFaceRangeSkipping faces() const;
1246
1251 ConstFaceRange all_faces() const;
1252
1257 template <typename HandleType>
1259
1264 template <typename HandleType>
1266
1267
1281
1292
1303
1308 ConstVertexVertexRange vv_range(VertexHandle _vh) const;
1309
1314 ConstVertexIHalfedgeRange vih_range(VertexHandle _vh) const;
1315
1321 ConstVertexIHalfedgeRange vih_range(HalfedgeHandle _heh) const;
1322
1327 ConstVertexOHalfedgeRange voh_range(VertexHandle _vh) const;
1328
1334 ConstVertexOHalfedgeRange voh_range(HalfedgeHandle _heh) const;
1335
1340 ConstVertexEdgeRange ve_range(VertexHandle _vh) const ;
1341
1346 ConstVertexFaceRange vf_range(VertexHandle _vh) const;
1347
1352 ConstFaceVertexRange fv_range(FaceHandle _fh) const;
1353
1358 ConstFaceHalfedgeRange fh_range(FaceHandle _fh) const;
1359
1364 ConstFaceEdgeRange fe_range(FaceHandle _fh) const;
1365
1370 ConstFaceFaceRange ff_range(FaceHandle _fh) const;
1371
1376 ConstEdgeVertexRange ev_range(EdgeHandle _eh) const;
1377
1382 ConstEdgeHalfedgeRange eh_range(EdgeHandle _eh) const;
1383
1389 ConstEdgeHalfedgeRange eh_range(HalfedgeHandle _heh) const;
1390
1395 ConstEdgeFaceRange ef_range(EdgeHandle _eh) const;
1396
1401 ConstHalfedgeLoopRange hl_range(HalfedgeHandle _heh) const;
1402
1403
1408 ConstVertexVertexCWRange vv_cw_range(VertexHandle _vh) const;
1409
1414 ConstVertexIHalfedgeCWRange vih_cw_range(VertexHandle _vh) const;
1415
1421 ConstVertexIHalfedgeCWRange vih_cw_range(HalfedgeHandle _heh) const;
1422
1427 ConstVertexOHalfedgeCWRange voh_cw_range(VertexHandle _vh) const;
1428
1434 ConstVertexOHalfedgeCWRange voh_cw_range(HalfedgeHandle _heh) const;
1435
1440 ConstVertexEdgeCWRange ve_cw_range(VertexHandle _vh) const;
1441
1446 ConstVertexFaceCWRange vf_cw_range(VertexHandle _vh) const;
1447
1452 ConstFaceVertexCWRange fv_cw_range(FaceHandle _fh) const;
1453
1458 ConstFaceHalfedgeCWRange fh_cw_range(FaceHandle _fh) const;
1459
1464 ConstFaceEdgeCWRange fe_cw_range(FaceHandle _fh) const;
1465
1470 ConstFaceFaceCWRange ff_cw_range(FaceHandle _fh) const;
1471
1476 ConstHalfedgeLoopCWRange hl_cw_range(HalfedgeHandle _heh) const;
1477
1478
1483 ConstVertexVertexCCWRange vv_ccw_range(VertexHandle _vh) const;
1484
1489 ConstVertexIHalfedgeCCWRange vih_ccw_range(VertexHandle _vh) const;
1490
1496 ConstVertexIHalfedgeCCWRange vih_ccw_range(HalfedgeHandle _heh) const;
1497
1502 ConstVertexOHalfedgeCCWRange voh_ccw_range(VertexHandle _vh) const;
1503
1509 ConstVertexOHalfedgeCCWRange voh_ccw_range(HalfedgeHandle _heh) const;
1510
1515 ConstVertexEdgeCCWRange ve_ccw_range(VertexHandle _vh) const ;
1516
1521 ConstVertexFaceCCWRange vf_ccw_range(VertexHandle _vh) const;
1522
1527 ConstFaceVertexCCWRange fv_ccw_range(FaceHandle _fh) const;
1528
1533 ConstFaceHalfedgeCCWRange fh_ccw_range(FaceHandle _fh) const;
1534
1539 ConstFaceEdgeCCWRange fe_ccw_range(FaceHandle _fh) const;
1540
1545 ConstFaceFaceCCWRange ff_ccw_range(FaceHandle _fh) const;
1546
1547
1552 ConstHalfedgeLoopCCWRange hl_ccw_range(HalfedgeHandle _heh) const;
1553
1555
1556 //===========================================================================
1559 //===========================================================================
1560
1569 { return ArrayKernel::is_boundary(_heh); }
1570
1579 bool is_boundary(EdgeHandle _eh) const
1580 {
1581 return (is_boundary(halfedge_handle(_eh, 0)) ||
1582 is_boundary(halfedge_handle(_eh, 1)));
1583 }
1584
1597 {
1598 HalfedgeHandle heh(halfedge_handle(_vh));
1599 return (!(heh.is_valid() && face_handle(heh).is_valid()));
1600 }
1601
1611 bool is_boundary(FaceHandle _fh, bool _check_vertex=false) const;
1612
1623 bool is_manifold(VertexHandle _vh) const;
1624
1627 // --- misc ---
1628
1632 void adjust_outgoing_halfedge(VertexHandle _vh);
1633
1635 SmartHalfedgeHandle find_halfedge(VertexHandle _start_vh, VertexHandle _end_vh) const;
1637 uint valence(VertexHandle _vh) const;
1639 uint valence(FaceHandle _fh) const;
1640
1641 // --- connectivity operattions
1642
1657 void collapse(HalfedgeHandle _heh);
1662 bool is_simple_link(EdgeHandle _eh) const;
1667 bool is_simply_connected(FaceHandle _fh) const;
1680 FaceHandle remove_edge(EdgeHandle _eh);
1684 void reinsert_edge(EdgeHandle _eh);
1694 HalfedgeHandle insert_edge(HalfedgeHandle _prev_heh, HalfedgeHandle _next_heh);
1695
1708 void split(FaceHandle _fh, VertexHandle _vh);
1709
1723 void split_copy(FaceHandle _fh, VertexHandle _vh);
1724
1738 void triangulate(FaceHandle _fh);
1739
1742 void triangulate();
1743
1754 void split_edge(EdgeHandle _eh, VertexHandle _vh);
1755
1767 void split_edge_copy(EdgeHandle _eh, VertexHandle _vh);
1768
1769
1776 const Vertex& deref(VertexHandle _h) const { return vertex(_h); }
1777 Vertex& deref(VertexHandle _h) { return vertex(_h); }
1778 const Halfedge& deref(HalfedgeHandle _h) const { return halfedge(_h); }
1779 Halfedge& deref(HalfedgeHandle _h) { return halfedge(_h); }
1780 const Edge& deref(EdgeHandle _h) const { return edge(_h); }
1781 Edge& deref(EdgeHandle _h) { return edge(_h); }
1782 const Face& deref(FaceHandle _h) const { return face(_h); }
1783 Face& deref(FaceHandle _h) { return face(_h); }
1785
1786protected:
1788 void collapse_edge(HalfedgeHandle _hh);
1790 void collapse_loop(HalfedgeHandle _hh);
1791
1792
1793
1794private: // Working storage for add_face()
1796 {
1797 HalfedgeHandle halfedge_handle;
1798 bool is_new;
1799 bool needs_adjust;
1800 };
1801 std::vector<AddFaceEdgeInfo> edgeData_; //
1802 std::vector<std::pair<HalfedgeHandle, HalfedgeHandle> > next_cache_; // cache for set_next_halfedge and vertex' set_halfedge
1803
1804};
1805
1806template <>
1808{
1809 using Range = ConstVertexRange;
1811};
1812
1813template <>
1815{
1816 using Range = ConstHalfedgeRange;
1818};
1819
1820template <>
1822{
1823 using Range = ConstEdgeRange;
1825};
1826
1827template <>
1829{
1830 using Range = ConstFaceRange;
1832};
1833
1834}//namespace OpenMesh
1835
1836#define OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE
1837#include <OpenMesh/Core/Mesh/SmartHandles.hh>
1838#include <OpenMesh/Core/Mesh/PolyConnectivity_inline_impl.hh>
1839#undef OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE
1840
1841#endif//OPENMESH_POLYCONNECTIVITY_HH
bool is_boundary(HalfedgeHandle _heh) const
Is halfedge _heh a boundary halfedge (is its face handle invalid) ?
Definition: ArrayKernel.hh:400
void assign_connectivity(const ArrayKernel &_other)
Definition: ArrayKernel.cc:71
Generic class for iterator ranges.
Generic class for vertex/halfedge/edge/face ranges.
Connectivity Class for polygonal meshes.
const Halfedge & deref(HalfedgeHandle _h) const
Get item from handle.
VertexVertexCWIter VVCWIter
Alias typedef.
ConstVertexVertexIter CVVIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexVertexIter, VertexHandle, VertexHandle, &PolyConnectivity::cvv_begin, &PolyConnectivity::cvv_end > > ConstVertexVertexRange
EdgeIter edges_end()
End iterator for edges.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceVertexIter, FaceHandle, VertexHandle, &PolyConnectivity::cfv_begin, &PolyConnectivity::cfv_end > > ConstFaceVertexRange
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceHalfedgeCWIter, FaceHandle, HalfedgeHandle, &PolyConnectivity::cfh_cwbegin, &PolyConnectivity::cfh_cwend > > ConstFaceHalfedgeCWRange
EdgeIter ConstEdgeIter
Linear iterator.
EdgeIter EIter
Alias typedef.
VertexVertexIter VVIter
Alias typedef.
Iterators::GenericCirculatorT< VertexEdgeTraits, false > VertexEdgeCCWIter
VertexVertexCCWIter VVCCWIter
Alias typedef.
ConstVertexIHalfedgeCCWIter CVIHCCWIter
Alias typedef.
HalfedgeLoopCWIter ConstHalfedgeLoopCWIter
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceCWIter, FaceHandle, FaceHandle, &PolyConnectivity::cff_cwbegin, &PolyConnectivity::cff_cwend > > ConstFaceFaceCWRange
Edge & deref(EdgeHandle _h)
Get item from handle.
HalfedgeIter halfedges_end()
End iterator for halfedges.
ConstFaceHalfedgeCCWIter CFHCCWIter
Alias typedef.
VertexHandle VHandle
Alias typedef.
ConstFaceVertexCCWIter CFVCCWIter
Alias typedef.
PolyConnectivity This
Invalid handle.
Iterators::GenericIteratorT< This, This::HalfedgeHandle, ArrayKernel, &ArrayKernel::has_halfedge_status, &ArrayKernel::n_halfedges > HalfedgeIter
Linear iterator.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceHalfedgeCCWIter, FaceHandle, HalfedgeHandle, &PolyConnectivity::cfh_ccwbegin, &PolyConnectivity::cfh_ccwend > > ConstFaceHalfedgeCCWRange
ConstVertexFaceCCWIter CVFCCWIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexVertexCCWIter, VertexHandle, VertexHandle, &PolyConnectivity::cvv_ccwbegin, &PolyConnectivity::cvv_ccwend > > ConstVertexVertexCCWRange
VertexIHalfedgeIter ConstVertexIHalfedgeIter
VertexFaceCCWIter VFCCWIter
Alias typedef.
FaceEdgeCWIter FECWIter
Alias typedef.
Iterators::GenericCirculatorT< VertexVertexTraits, false > VertexVertexCCWIter
VertexIter vertices_sbegin()
Begin iterator for vertices.
HalfedgeIter halfedges_sbegin()
Begin iterator for halfedges.
FaceVertexCCWIter FVCCWIter
Alias typedef.
ConstVertexIter CVIter
Alias typedef.
ConstHalfedgeIter CHIter
Alias typedef.
Iterators::GenericCirculatorT< FaceVertexTraits, false > FaceVertexCWIter
HalfedgeIter halfedges_begin()
Begin iterator for halfedges.
static const HalfedgeHandle InvalidHalfedgeHandle
Invalid handle.
SmartHalfedgeHandle opposite_halfedge_handle(SmartHalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
FaceHalfedgeCCWIter ConstFaceHalfedgeCCWIter
EdgeIter edges_sbegin()
Begin iterator for edges.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexVertexCWIter, VertexHandle, VertexHandle, &PolyConnectivity::cvv_cwbegin, &PolyConnectivity::cvv_cwend > > ConstVertexVertexCWRange
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexOHalfedgeCCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvoh_ccwbegin, &PolyConnectivity::cvoh_ccwend > > ConstVertexOHalfedgeCCWRange
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstEdgeIter, &PolyConnectivity::edges_sbegin, &PolyConnectivity::edges_end > > ConstEdgeRangeSkipping
EdgeIter edges_begin()
Begin iterator for edges.
ConstFaceEdgeCCWIter CFECCWIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstHalfedgeLoopCCWIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity::chl_ccwbegin, &PolyConnectivity::chl_ccwend > > ConstHalfedgeLoopCCWRange
ConstEdgeIter CEIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceVertexCWIter, FaceHandle, VertexHandle, &PolyConnectivity::cfv_cwbegin, &PolyConnectivity::cfv_cwend > > ConstFaceVertexCWRange
ElementRange< HandleType >::Range all_elements() const
ConstFaceVertexIter CFVIter
Alias typedef.
VertexVertexCCWIter ConstVertexVertexCCWIter
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexIHalfedgeIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvih_begin, &PolyConnectivity::cvih_end > > ConstVertexIHalfedgeRange
ConstVertexOHalfedgeIter CVOHIter
Alias typedef.
Iterators::GenericIteratorT< This, This::VertexHandle, ArrayKernel, &ArrayKernel::has_vertex_status, &ArrayKernel::n_vertices > VertexIter
Linear iterator.
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstFaceIter, &PolyConnectivity::faces_begin, &PolyConnectivity::faces_end > > ConstFaceRange
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceCCWIter, FaceHandle, FaceHandle, &PolyConnectivity::cff_ccwbegin, &PolyConnectivity::cff_ccwend > > ConstFaceFaceCCWRange
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexIHalfedgeCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvih_cwbegin, &PolyConnectivity::cvih_cwend > > ConstVertexIHalfedgeCWRange
Iterators::GenericCirculatorT_DEPRECATED< VertexOppositeHalfedgeTraits > VertexIHalfedgeIter
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstVertexIter, &PolyConnectivity::vertices_begin, &PolyConnectivity::vertices_end > > ConstVertexRange
FaceFaceCCWIter ConstFaceFaceCCWIter
ConstFaceEdgeIter CFEIter
Alias typedef.
VertexOHalfedgeCWIter ConstVertexOHalfedgeCWIter
ConstVertexIHalfedgeCWIter CVIHCWIter
Alias typedef.
ConstFaceHalfedgeIter CFHIter
Alias typedef.
ConstFaceVertexCWIter CFVCWIter
Alias typedef.
VertexFaceIter VFIter
Alias typedef.
Iterators::GenericCirculatorT_DEPRECATED< VertexVertexTraits > VertexVertexIter
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexOHalfedgeCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvoh_cwbegin, &PolyConnectivity::cvoh_cwend > > ConstVertexOHalfedgeCWRange
HalfedgeLoopCCWIter ConstHalfedgeLoopCCWIter
ConstVertexOHalfedgeCCWIter CVOHCCWIter
Alias typedef.
HalfedgeIter HIter
Alias typedef.
Iterators::GenericCirculatorT_DEPRECATED< FaceHalfedgeTraits > FaceHalfedgeIter
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeIter, FaceHandle, EdgeHandle, &PolyConnectivity::cfe_begin, &PolyConnectivity::cfe_end > > ConstFaceEdgeRange
Iterators::GenericCirculatorT_DEPRECATED< VertexHalfedgeTraits > VertexOHalfedgeIter
HalfedgeLoopIter ConstHalfedgeLoopIter
HalfedgeHandle HHandle
Alias typedef.
static bool is_triangles()
Alias typedef.
ConstFaceFaceCWIter CFFCWIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstHalfedgeLoopIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity::chl_begin, &PolyConnectivity::chl_end > > ConstHalfedgeLoopRange
VertexIHalfedgeIter VIHIter
Alias typedef.
VertexIter VIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexEdgeCWIter, VertexHandle, EdgeHandle, &PolyConnectivity::cve_cwbegin, &PolyConnectivity::cve_cwend > > ConstVertexEdgeCWRange
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexEdgeCCWIter, VertexHandle, EdgeHandle, &PolyConnectivity::cve_ccwbegin, &PolyConnectivity::cve_ccwend > > ConstVertexEdgeCCWRange
VertexIter ConstVertexIter
Linear iterator.
Iterators::GenericIteratorT< This, This::FaceHandle, ArrayKernel, &ArrayKernel::has_face_status, &ArrayKernel::n_faces > FaceIter
Linear iterator.
Iterators::GenericCirculatorT_DEPRECATED< VertexEdgeTraits > VertexEdgeIter
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeCWIter, FaceHandle, EdgeHandle, &PolyConnectivity::cfe_cwbegin, &PolyConnectivity::cfe_cwend > > ConstFaceEdgeCWRange
VertexIHalfedgeCCWIter ConstVertexIHalfedgeCCWIter
ConstVertexEdgeCWIter CVECWIter
Alias typedef.
VertexFaceCWIter ConstVertexFaceCWIter
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexEdgeIter, VertexHandle, EdgeHandle, &PolyConnectivity::cve_begin, &PolyConnectivity::cve_end > > ConstVertexEdgeRange
ConstEdgeVertexIter CEVIter
Alias typedef.
FaceEdgeCCWIter FECWWIter
Alias typedef.
Iterators::GenericCirculatorT_DEPRECATED< EdgeHalfedgeTraits > EdgeHalfedgeIter
FaceHalfedgeIter FHIter
Alias typedef.
EdgeHalfedgeIter EHIter
Alias typedef.
ElementRange< HandleType >::RangeSkipping elements() const
bool is_boundary(EdgeHandle _eh) const
Is the edge a boundary edge?
const Edge & deref(EdgeHandle _h) const
Get item from handle.
FaceIter faces_sbegin()
Begin iterator for faces.
virtual ~PolyConnectivity()
Alias typedef.
Iterators::GenericCirculatorT< VertexHalfedgeTraits, false > VertexOHalfedgeCCWIter
Iterators::GenericCirculatorT_DEPRECATED< VertexFaceTraits > VertexFaceIter
VertexEdgeCWIter VECWIter
Alias typedef.
static const FaceHandle InvalidFaceHandle
Invalid handle.
Iterators::GenericIteratorT< This, This::EdgeHandle, ArrayKernel, &ArrayKernel::has_edge_status, &ArrayKernel::n_edges > EdgeIter
Linear iterator.
ConstVertexEdgeCCWIter CVECCWIter
Alias typedef.
EdgeHalfedgeIter ConstEdgeHalfedgeIter
EdgeVertexIter EVIter
Alias typedef.
ConstVertexVertexCCWIter CVVCCWIter
Alias typedef.
FaceHalfedgeCCWIter FHCWWIter
Alias typedef.
bool is_boundary(VertexHandle _vh) const
Is vertex _vh a boundary vertex ?
Iterators::GenericCirculatorT< FaceHalfedgeTraits, true > HalfedgeLoopCCWIter
Iterators::GenericCirculatorT< FaceFaceTraits, true > FaceFaceCCWIter
FaceEdgeCCWIter ConstFaceEdgeCCWIter
ConstVertexVertexCWIter CVVCWIter
Alias typedef.
Iterators::GenericCirculatorT_DEPRECATED< FaceHalfedgeTraits > HalfedgeLoopIter
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstEdgeIter, &PolyConnectivity::edges_begin, &PolyConnectivity::edges_end > > ConstEdgeRange
ConstEdgeFaceIter CEFIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeCCWIter, FaceHandle, EdgeHandle, &PolyConnectivity::cfe_ccwbegin, &PolyConnectivity::cfe_ccwend > > ConstFaceEdgeCCWRange
VertexOHalfedgeCCWIter ConstVertexOHalfedgeCCWIter
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstHalfedgeIter, &PolyConnectivity::halfedges_sbegin, &PolyConnectivity::halfedges_end > > ConstHalfedgeRangeSkipping
std::vector< std::pair< HalfedgeHandle, HalfedgeHandle > > next_cache_
Get item from handle.
ConstVertexOHalfedgeCWIter CVOHCWIter
Alias typedef.
FaceHalfedgeIter ConstFaceHalfedgeIter
VertexOHalfedgeCWIter VOHCWIter
Alias typedef.
Iterators::GenericCirculatorT_DEPRECATED< FaceVertexTraits > FaceVertexIter
FaceVertexCWIter FVCWIter
Alias typedef.
Face & deref(FaceHandle _h)
Get item from handle.
EdgeFaceIter EFIter
Alias typedef.
static const VertexHandle InvalidVertexHandle
Invalid handle.
VertexIter vertices_begin()
Begin iterator for vertices.
ConstFaceIter CFIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexFaceCWIter, VertexHandle, FaceHandle, &PolyConnectivity::cvf_cwbegin, &PolyConnectivity::cvf_cwend > > ConstVertexFaceCWRange
Iterators::GenericCirculatorT< VertexFaceTraits, true > VertexFaceCWIter
HalfedgeIter ConstHalfedgeIter
Linear iterator.
Iterators::GenericCirculatorT< VertexOppositeHalfedgeTraits, false > VertexIHalfedgeCCWIter
FaceVertexCCWIter ConstFaceVertexCCWIter
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexOHalfedgeIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvoh_begin, &PolyConnectivity::cvoh_end > > ConstVertexOHalfedgeRange
static const EdgeHandle InvalidEdgeHandle
Invalid handle.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeHalfedgeIter, EdgeHandle, HalfedgeHandle, &PolyConnectivity::ceh_begin, &PolyConnectivity::ceh_end > > ConstEdgeHalfedgeRange
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstVertexIter, &PolyConnectivity::vertices_sbegin, &PolyConnectivity::vertices_end > > ConstVertexRangeSkipping
Halfedge & deref(HalfedgeHandle _h)
Get item from handle.
Iterators::GenericCirculatorT< VertexEdgeTraits, true > VertexEdgeCWIter
FaceEdgeIter FEIter
Alias typedef.
ConstVertexEdgeIter CVEIter
Alias typedef.
Iterators::GenericCirculatorT< FaceHalfedgeTraits, true > FaceHalfedgeCCWIter
Iterators::GenericCirculatorT< VertexOppositeHalfedgeTraits, true > VertexIHalfedgeCWIter
FaceIter faces_end()
End iterator for faces.
void assign_connectivity(const PolyConnectivity &_other)
VertexOHalfedgeCCWIter VOHCCWIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexFaceIter, VertexHandle, FaceHandle, &PolyConnectivity::cvf_begin, &PolyConnectivity::cvf_end > > ConstVertexFaceRange
EdgeHandle EHandle
Alias typedef.
FaceHandle FHandle
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexIHalfedgeCCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvih_ccwbegin, &PolyConnectivity::cvih_ccwend > > ConstVertexIHalfedgeCCWRange
Iterators::GenericCirculatorT< FaceVertexTraits, true > FaceVertexCCWIter
ConstFaceEdgeCWIter CFECWIter
Alias typedef.
ConstFaceFaceIter CFFIter
Alias typedef.
VertexFaceCCWIter ConstVertexFaceCCWIter
ConstEdgeHalfedgeIter CEHIter
Alias typedef.
VertexOHalfedgeIter ConstVertexOHalfedgeIter
VertexIHalfedgeCWIter VIHICWter
Alias typedef.
VertexEdgeIter VEIter
Alias typedef.
FaceIter ConstFaceIter
Linear iterator.
VertexOHalfedgeIter VOHIter
Alias typedef.
VertexIHalfedgeCWIter ConstVertexIHalfedgeCWIter
VertexEdgeCWIter ConstVertexEdgeCWIter
Iterators::GenericCirculatorT< VertexVertexTraits, true > VertexVertexCWIter
ConstVertexFaceCWIter CVFCWIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeFaceIter, EdgeHandle, FaceHandle, &PolyConnectivity::cef_begin, &PolyConnectivity::cef_end > > ConstEdgeFaceRange
bool is_boundary(HalfedgeHandle _heh) const
Check if the halfedge is at the boundary.
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstHalfedgeIter, &PolyConnectivity::halfedges_begin, &PolyConnectivity::halfedges_end > > ConstHalfedgeRange
Iterators::GenericCirculatorT< FaceHalfedgeTraits, false > FaceHalfedgeCWIter
VertexVertexCWIter ConstVertexVertexCWIter
VertexEdgeCCWIter ConstVertexEdgeCCWIter
VertexVertexIter ConstVertexVertexIter
VertexFaceCWIter VFCWIter
Alias typedef.
Iterators::GenericCirculatorT_DEPRECATED< FaceFaceTraits > FaceFaceIter
FaceHalfedgeCWIter ConstFaceHalfedgeCWIter
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceHalfedgeIter, FaceHandle, HalfedgeHandle, &PolyConnectivity::cfh_begin, &PolyConnectivity::cfh_end > > ConstFaceHalfedgeRange
Iterators::GenericCirculatorT_DEPRECATED< EdgeFaceTraits > EdgeFaceIter
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeVertexIter, EdgeHandle, VertexHandle, &PolyConnectivity::cev_begin, &PolyConnectivity::cev_end > > ConstEdgeVertexRange
Iterators::GenericCirculatorT< FaceHalfedgeTraits, false > HalfedgeLoopCWIter
const Vertex & deref(VertexHandle _h) const
Get item from handle.
Iterators::GenericCirculatorT< FaceFaceTraits, false > FaceFaceCWIter
Iterators::GenericCirculatorT_DEPRECATED< FaceEdgeTraits > FaceEdgeIter
VertexIter vertices_end()
End iterator for vertices.
Iterators::GenericCirculatorT< FaceEdgeTraits, false > FaceEdgeCWIter
Vertex & deref(VertexHandle _h)
Get item from handle.
Iterators::GenericCirculatorT_DEPRECATED< EdgeVertexTraits > EdgeVertexIter
Iterators::GenericCirculatorT< VertexFaceTraits, false > VertexFaceCCWIter
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceIter, FaceHandle, FaceHandle, &PolyConnectivity::cff_begin, &PolyConnectivity::cff_end > > ConstFaceFaceRange
ConstFaceHalfedgeCWIter CFHCWIter
Alias typedef.
const Face & deref(FaceHandle _h) const
Get item from handle.
FaceIter faces_begin()
Begin iterator for faces.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstHalfedgeLoopCWIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity::chl_cwbegin, &PolyConnectivity::chl_cwend > > ConstHalfedgeLoopCWRange
FaceVertexIter FVIter
Alias typedef.
FaceFaceIter FFIter
Alias typedef.
FaceHalfedgeCWIter FHCWIter
Alias typedef.
Iterators::GenericCirculatorT< FaceEdgeTraits, true > FaceEdgeCCWIter
ConstFaceFaceCCWIter CFFCCWIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexFaceCCWIter, VertexHandle, FaceHandle, &PolyConnectivity::cvf_ccwbegin, &PolyConnectivity::cvf_ccwend > > ConstVertexFaceCCWRange
VertexIHalfedgeCCWIter VIHICCWter
Alias typedef.
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstFaceIter, &PolyConnectivity::faces_sbegin, &PolyConnectivity::faces_end > > ConstFaceRangeSkipping
ConstVertexIHalfedgeIter CVIHIter
Alias typedef.
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceVertexCCWIter, FaceHandle, VertexHandle, &PolyConnectivity::cfv_ccwbegin, &PolyConnectivity::cfv_ccwend > > ConstFaceVertexCCWRange
VertexEdgeCCWIter VECCWIter
Alias typedef.
FaceVertexCWIter ConstFaceVertexCWIter
FaceIter FIter
Alias typedef.
std::vector< AddFaceEdgeInfo > edgeData_
Get item from handle.
Iterators::GenericCirculatorT< VertexHalfedgeTraits, true > VertexOHalfedgeCWIter
ConstVertexFaceIter CVFIter
Alias typedef.
Handle for a edge entity.
Definition: Handles.hh:135
Handle for a face entity.
Definition: Handles.hh:142
Handle for a halfedge entity.
Definition: Handles.hh:128
Smart version of VertexHandle contains a pointer to the corresponding mesh and allows easier access t...
Handle for a vertex entity.
Definition: Handles.hh:121