IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
Mesh3dTriangleTriangleConstCirculator.h
1 // Mesh3dTriangleTriangleConstCirculator.h:
3 // ----------------------------------------
4 //
15 
16 #ifndef __IPSDKGEOMETRY_MESH3DTRIANGLETRIANGLECONSTCIRCULATOR_H__
17 #define __IPSDKGEOMETRY_MESH3DTRIANGLETRIANGLECONSTCIRCULATOR_H__
18 
21 #include <IPSDKGeometry/Entity/3d/Triangle/Triangle3d.h>
24 
25 namespace ipsdk {
26 namespace geom {
27 
30 
31 template <typename MeshType>
33 {
34 // predefined public types
35 public:
37  typedef typename MeshType::DataType T;
38 
40  typedef typename MeshType::VertexType VertexType;
41 
44 
47 
49  typedef std::input_iterator_tag iterator_category;
50 
53 
54  // difference type for iterator
55  typedef ipUInt32 difference_type;
56 
58  typedef const TriangleType* pointer;
59 
60  // reference type associated to iterator
61  typedef const TriangleType& reference;
62 
63 public:
67  _pMesh(0),
70 
71  {
72  }
73  Mesh3dTriangleTriangleConstCirculator(const MeshType* pMesh,
74  const ipUInt32 startTriangleIdx) :
75  _pMesh(pMesh),
76  _startHalfEdgeIdx(_pMesh->getTriangleToHalfEdgeColl()[startTriangleIdx]),
78  {
79  updateData();
80  }
81  Mesh3dTriangleTriangleConstCirculator(const Iterator& iter) :
82  _pMesh(iter._pMesh),
85  _triangle(iter._triangle)
86  {
87  }
88  Mesh3dTriangleTriangleConstCirculator& operator= (const Iterator& iter)
89  {
90  _pMesh = iter._pMesh;
91  _startHalfEdgeIdx = iter._startHalfEdgeIdx;
92  _curHalfEdgeIdx = iter._curHalfEdgeIdx;
93  _triangle = iter._triangle;
94  }
95  ~Mesh3dTriangleTriangleConstCirculator()
96  {
97  }
99 
100 // methods
101 public:
103  const ipUInt32 getStartHalfEdgeIdx() const;
104 
106  const ipUInt32 getCurHalfEdgeIdx() const;
107 
110 
112  inline Iterator& operator++();
113 
116  inline bool operator==(const Iterator& iter) const;
117  inline bool operator!=(const Iterator& iter) const;
119 
121  inline const TriangleType* operator->() const;
122 
124  inline const TriangleType& operator*() const;
125 
127  void swap(Iterator& iter);
128 
129 protected:
131  inline void updateData();
132 
133 // attributes
134 protected:
136  const MeshType* _pMesh;
137 
140 
144 
147 };
148 
151 
152 template <typename MeshType>
153 IPSDK_FORCEINLINE const ipUInt32
155 {
156  return _startHalfEdgeIdx;
157 }
158 
159 template <typename MeshType>
160 IPSDK_FORCEINLINE const ipUInt32
162 {
163  return _curHalfEdgeIdx;
164 }
165 
166 template <typename MeshType>
169 {
170  const Mesh3dHalfEdge& startHalfEdge = _pMesh->getHalfEdgeColl()[_startHalfEdgeIdx];
171  const Mesh3dHalfEdge& nextHalfEdge = _pMesh->getHalfEdgeColl()[startHalfEdge._nextHalfEdgeIdx];
172  const Mesh3dHalfEdge& prevHalfEdge = _pMesh->getHalfEdgeColl()[nextHalfEdge._nextHalfEdgeIdx];
173  const VertexType& v0 = _pMesh->getVertexColl()[startHalfEdge._startVertexIdx];
174  const VertexType& v1 = _pMesh->getVertexColl()[nextHalfEdge._startVertexIdx];
175  const VertexType& v2 = _pMesh->getVertexColl()[prevHalfEdge._startVertexIdx];
176 
177  return TriangleType(v0, v1, v2);
178 }
179 
180 template <typename MeshType>
183 {
184  // search for next half edge
185  const Mesh3dHalfEdge& curHalfEdge = _pMesh->getHalfEdgeColl()[_curHalfEdgeIdx];
186  const Mesh3dHalfEdge& oppositeHalfEdge = _pMesh->getHalfEdgeColl()[curHalfEdge._oppositeHalfEdgeIdx];
187  _curHalfEdgeIdx = oppositeHalfEdge._nextHalfEdgeIdx;
188  if (_curHalfEdgeIdx == _startHalfEdgeIdx)
189  _curHalfEdgeIdx = NumericLimits<ipUInt32>::max();
190  updateData();
191 
192  return *this;
193 }
194 
195 template <typename MeshType>
196 IPSDK_FORCEINLINE bool
198 {
199  return _curHalfEdgeIdx == iter._curHalfEdgeIdx;
200 }
201 
202 template <typename MeshType>
203 IPSDK_FORCEINLINE bool
205 {
206  return _curHalfEdgeIdx != iter._curHalfEdgeIdx;
207 }
208 
209 template <typename MeshType>
212 {
213  return &_triangle;
214 }
215 
216 template <typename MeshType>
219 {
220  return _triangle;
221 }
222 
223 template <typename MeshType>
224 IPSDK_FORCEINLINE void
226 {
227  const Mesh3dHalfEdge& curHalfEdge = _pMesh->getHalfEdgeColl()[_curHalfEdgeIdx];
228  const Mesh3dHalfEdge& oppositeHalfEdge = _pMesh->getHalfEdgeColl()[curHalfEdge._oppositeHalfEdgeIdx];
229  const Mesh3dHalfEdge& nextOppositeHalfEdge = _pMesh->getHalfEdgeColl()[oppositeHalfEdge._nextHalfEdgeIdx];
230  const Mesh3dHalfEdge& prevOppositeHalfEdge = _pMesh->getHalfEdgeColl()[nextOppositeHalfEdge._nextHalfEdgeIdx];
231  const VertexType& v0 = _pMesh->getVertexColl()[oppositeHalfEdge._startVertexIdx];
232  const VertexType& v1 = _pMesh->getVertexColl()[nextOppositeHalfEdge._startVertexIdx];
233  const VertexType& v2 = _pMesh->getVertexColl()[prevOppositeHalfEdge._startVertexIdx];
234 
235  _triangle.setCoords(v0, v1, v2);
236 }
237 
238 template <typename MeshType>
239 inline void
241 {
242  std::swap(_pMesh, iter._pMesh);
243  std::swap(_startHalfEdgeIdx, iter._startHalfEdgeIdx);
244  std::swap(_curHalfEdgeIdx, iter._curHalfEdgeIdx);
245  std::swap(_triangle, iter._triangle);
246 }
247 
250 
251 } // end of namespace geom
252 } // end of namespace ipsdk
253 
254 #endif // __IPSDKGEOMETRY_MESH3DTRIANGLETRIANGLECONSTCIRCULATOR_H__
void swap(Iterator &iter)
swap between iterators
Definition: Mesh3dTriangleTriangleConstCirculator.h:240
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
ipUInt32 _curHalfEdgeIdx
Definition: Mesh3dTriangleTriangleConstCirculator.h:143
bool operator==(const Iterator &iter) const
iterator comparison
Definition: Mesh3dTriangleTriangleConstCirculator.h:197
TriangleType getStartTriangle() const
retrieve starting triangle associated to circulator
Definition: Mesh3dTriangleTriangleConstCirculator.h:168
const TriangleType * operator->() const
retrieve current triangle associated to iterator position
Definition: Mesh3dTriangleTriangleConstCirculator.h:211
TriangleType value_type
value type associated to iterator
Definition: Mesh3dTriangleTriangleConstCirculator.h:52
bool operator!=(const Iterator &iter) const
iterator comparison
Definition: Mesh3dTriangleTriangleConstCirculator.h:204
Mesh3dTriangleTriangleConstCirculator< MeshType > Iterator
iterator type
Definition: Mesh3dTriangleTriangleConstCirculator.h:46
MeshType::DataType T
underlying mesh 3d data type
Definition: Mesh3dTriangleTriangleConstCirculator.h:37
Definition: Mesh3dTypes.h:52
Definition: NumericLimits.h:27
const MeshType * _pMesh
reference to mesh 3d associated to iterator
Definition: Mesh3dTriangleTriangleConstCirculator.h:136
const ipUInt32 getStartHalfEdgeIdx() const
retrieve starting half edge index associated to circulator
Definition: Mesh3dTriangleTriangleConstCirculator.h:154
Triangle3d< T > TriangleType
underlying triangle 3d type
Definition: Mesh3dTriangleTriangleConstCirculator.h:43
IPSDK_FORCEINLINE PackT max(const PackT &in1, const PackT &in2)
returns the maximum of 2 packs
Definition: max.h:40
const ipUInt32 getCurHalfEdgeIdx() const
retrieve current half edge index associated to circulator
Definition: Mesh3dTriangleTriangleConstCirculator.h:161
MeshType::VertexType VertexType
underlying mesh 3d vertex type
Definition: Mesh3dTriangleTriangleConstCirculator.h:40
Predefined types for mesh 3d management.
Definition of import/export macro for library.
Iterator class allowing to circulate over triangles immediatly neighbors of a given triangle...
Definition: Mesh3dTriangleTriangleConstCirculator.h:32
TriangleType _triangle
triangle data associated to current iterator position
Definition: Mesh3dTriangleTriangleConstCirculator.h:146
const TriangleType * pointer
pointer type for iterator
Definition: Mesh3dTriangleTriangleConstCirculator.h:58
3d triangle associated to cartesian 3d coordinates
Definition: Triangle3d.h:37
ipUInt64 _oppositeHalfEdgeIdx
Definition: Mesh3dTypes.h:62
Vector DataType
data type used for estimation
Definition: EstimationTypes.h:58
ipUInt64 _startVertexIdx
index of start vertex for half edge
Definition: Mesh3dTypes.h:55
std::input_iterator_tag iterator_category
iterator category
Definition: Mesh3dTriangleTriangleConstCirculator.h:49
ipUInt32 _startHalfEdgeIdx
starting half edge index
Definition: Mesh3dTriangleTriangleConstCirculator.h:139
void updateData()
method allowing to update iterator internal data
Definition: Mesh3dTriangleTriangleConstCirculator.h:225
ipUInt64 _nextHalfEdgeIdx
index of next half edge inside left triangle
Definition: Mesh3dTypes.h:65
const TriangleType & operator*() const
retrieve current triangle associated to iterator position
Definition: Mesh3dTriangleTriangleConstCirculator.h:218
Iterator & operator++()
increment of iterator
Definition: Mesh3dTriangleTriangleConstCirculator.h:182
uint32_t ipUInt32
Base types definition.
Definition: BaseTypes.h:53