ITK  5.4.0
Insight Toolkit
itkQuadEdgeMesh.h
Go to the documentation of this file.
1 /*=========================================================================
2  *
3  * Copyright NumFOCUS
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * https://www.apache.org/licenses/LICENSE-2.0.txt
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *=========================================================================*/
18 #ifndef itkQuadEdgeMesh_h
19 #define itkQuadEdgeMesh_h
20 
21 #include <cstdarg>
22 #include <queue>
23 #include <vector>
24 #include <list>
25 
26 #include "itkMesh.h"
27 
28 #include "itkQuadEdgeMeshTraits.h"
31 
33 #include "itkConceptChecking.h"
34 
35 
36 namespace itk
37 {
50 template <typename TPixel,
51  unsigned int VDimension,
52  typename TTraits = QuadEdgeMeshTraits<TPixel, VDimension, bool, bool>>
53 class ITK_TEMPLATE_EXPORT QuadEdgeMesh : public Mesh<TPixel, VDimension, TTraits>
54 {
55 public:
56  ITK_DISALLOW_COPY_AND_MOVE(QuadEdgeMesh);
57 
59  using Traits = TTraits;
60  using PixelType = TPixel;
61 
63  using Self = QuadEdgeMesh;
67 
69  static constexpr unsigned int PointDimension = Traits::PointDimension;
70  static constexpr unsigned int MaxTopologicalDimension = Traits::MaxTopologicalDimension;
71 
73  using typename Superclass::CellPixelType;
74  using typename Superclass::CoordRepType;
75  using typename Superclass::PointIdentifier;
76  using typename Superclass::PointHashType;
77  using typename Superclass::PointType;
78  using typename Superclass::CellTraits;
79 
80  using PointIdInternalIterator = typename CellTraits::PointIdInternalIterator;
81  using PointIdIterator = typename CellTraits::PointIdIterator;
82 
83  // Point section:
84  using typename Superclass::PointsContainer;
85  using typename Superclass::PointsContainerPointer;
86  using CoordRepArrayType = CoordRepType[Self::PointDimension];
87 
88  // Point data section:
89  using typename Superclass::PointDataContainer;
90  using typename Superclass::PointDataContainerPointer;
91  using typename Superclass::PointDataContainerIterator;
92  using typename Superclass::PointsContainerConstIterator;
93  using typename Superclass::PointsContainerIterator;
94 
95  // Cell section:
96  using typename Superclass::CellIdentifier;
97  using typename Superclass::CellType;
98  using typename Superclass::CellAutoPointer;
99  using typename Superclass::CellFeatureIdentifier;
100  using typename Superclass::CellFeatureCount;
101  using typename Superclass::CellMultiVisitorType;
102  using typename Superclass::CellsContainer;
103  using typename Superclass::CellsContainerPointer;
104 
105  using typename Superclass::CellsContainerConstIterator;
106  using typename Superclass::CellsContainerIterator;
107 
108  using typename Superclass::CellLinksContainer;
109  using typename Superclass::CellLinksContainerPointer;
110  using typename Superclass::CellLinksContainerIterator;
111 
112  // Cell data section:
113  using typename Superclass::CellDataContainer;
114  using typename Superclass::CellDataContainerPointer;
115  using typename Superclass::CellDataContainerIterator;
116 
117  // Point / Cell correspondence section:
118  using typename Superclass::PointCellLinksContainer;
119  using typename Superclass::PointCellLinksContainerIterator;
120 
121  // BoundaryAssignments section:
122  using typename Superclass::BoundaryAssignmentsContainer;
123  using typename Superclass::BoundaryAssignmentsContainerPointer;
124  using typename Superclass::BoundaryAssignmentsContainerVector;
125 
126  // Miscellaneous section:
127  using typename Superclass::BoundingBoxPointer;
128  using typename Superclass::BoundingBoxType;
129  using typename Superclass::RegionType;
130  using typename Superclass::InterpolationWeightType;
131 
133  using PrimalDataType = typename Traits::PrimalDataType;
134  using DualDataType = typename Traits::DualDataType;
135  using QEPrimal = typename Traits::QEPrimal;
136  using QEDual = typename Traits::QEDual;
137  using QEType = typename Traits::QEPrimal;
138  // See the TODO entry dated from 2005-05-28
139  // struct QEType : public QEPrimal, public QEDual {}
140  using VertexRefType = typename Traits::VertexRefType;
141  using FaceRefType = typename Traits::FaceRefType;
142  using VectorType = typename Traits::VectorType;
143 
147 
149  using FreePointIndexesType = std::queue<PointIdentifier>;
150  using FreeCellIndexesType = std::queue<CellIdentifier>;
151 
153  using PointIdList = std::vector<PointIdentifier>;
154  using EdgeListType = std::list<QEPrimal *>;
156 
158 
161 
163  static const CellIdentifier m_NoFace;
164 
165 public:
167  itkNewMacro(Self);
168  itkOverrideGetNameOfClassMacro(QuadEdgeMesh);
171 #if !defined(ITK_WRAPPING_PARSER)
172 
174 #endif
175 
176 public:
177  // Multithreading framework: not tested yet.
178  bool
180  {
181  return (false);
182  }
183 
184  void
185  Initialize() override;
186 
188  virtual void
189  Clear();
190 
191  CellsContainer *
193  {
194  return m_EdgeCellsContainer;
195  }
196  const CellsContainer *
197  GetEdgeCells() const
198  {
199  return m_EdgeCellsContainer;
200  }
201  void
203  {
204  m_EdgeCellsContainer = edgeCells;
205  }
206  void
208  {
209  m_EdgeCellsContainer->InsertElement(cellId, cellPointer.ReleaseOwnership());
210  }
211 
218  void
219  CopyInformation(const DataObject * data) override
220  {
221  (void)data;
222  }
223  void
224  Graft(const DataObject * data) override;
228  void
229  SqueezePointsIds();
230 
232  void
234  {}
235 
236 #if !defined(ITK_WRAPPING_PARSER)
237 
238  void
240  {
241  (void)dimension;
242  (void)container;
243  }
247  BoundaryAssignmentsContainerPointer
248  GetBoundaryAssignments(int dimension)
249  {
250  (void)dimension;
251  return (nullptr);
252  }
256  const BoundaryAssignmentsContainerPointer
257  GetBoundaryAssignments(int dimension) const
258  {
259  (void)dimension;
260  return (nullptr);
261  }
264 #endif
265 
267  void
268  SetBoundaryAssignment(int dimension,
269  CellIdentifier cellId,
270  CellFeatureIdentifier featureId,
271  CellIdentifier boundaryId)
272  {
273  (void)dimension;
274  (void)cellId;
275  (void)featureId;
276  (void)boundaryId;
277  }
281  bool
282  GetBoundaryAssignment(int dimension,
283  CellIdentifier cellId,
284  CellFeatureIdentifier featureId,
285  CellIdentifier * boundaryId) const
286  {
287  (void)dimension;
288  (void)cellId;
289  (void)featureId;
290  (void)boundaryId;
291  return (false); // ALEX: is it the good way?
292  }
296  bool
298  {
299  (void)dimension;
300  (void)cellId;
301  (void)featureId;
302  return (false); // ALEX: is it the good way?
303  }
307  bool
308  GetCellBoundaryFeature(int dimension,
309  CellIdentifier cellId,
310  CellFeatureIdentifier featureId,
311  CellAutoPointer & cellAP) const
312  {
313  (void)dimension;
314  (void)cellId;
315  (void)featureId;
316  (void)cellAP;
317  return (false);
318  }
322  CellIdentifier
324  CellIdentifier cellId,
325  CellFeatureIdentifier featureId,
326  std::set<CellIdentifier> * cellSet)
327  {
328  (void)dimension;
329  (void)cellId;
330  (void)featureId;
331  (void)cellSet;
332  return CellIdentifier{};
333  }
337  CellIdentifier
338  GetCellNeighbors(CellIdentifier itkNotUsed(cellId), std::set<CellIdentifier> * itkNotUsed(cellSet))
339  {
340  return CellIdentifier{};
341  }
342 
344  bool
346  CellIdentifier cellId,
347  CellFeatureIdentifier featureId,
348  CellAutoPointer & cellAP) const
349  {
350  (void)dimension;
351  (void)cellId;
352  (void)featureId;
353  (void)cellAP;
354  return (false); // ALEX: is it the good way?
355  }
359  void
360  SetCell(CellIdentifier cId, CellAutoPointer & cell);
361 
363  virtual PointIdentifier
364  FindFirstUnusedPointIndex();
365 
366  virtual CellIdentifier
367  FindFirstUnusedCellIndex();
368 
369  virtual void
370  PushOnContainer(EdgeCellType * newEdge);
371 
372  // Adding Point/Edge/Face methods
373  virtual PointIdentifier
374  AddPoint(const PointType & p);
375 
377  virtual QEPrimal *
378  AddEdge(const PointIdentifier & orgPid, const PointIdentifier & destPid);
379 
380  virtual QEPrimal *
381  AddEdgeWithSecurePointList(const PointIdentifier & orgPid, const PointIdentifier & destPid);
382 
384  virtual void
385  AddFace(QEPrimal * entry);
386 
391  virtual QEPrimal *
392  AddFace(const PointIdList & points);
393 
394  virtual QEPrimal *
395  AddFaceWithSecurePointList(const PointIdList & points);
396 
397  virtual QEPrimal *
398  AddFaceWithSecurePointList(const PointIdList & points, bool CheckEdges);
399 
401  virtual QEPrimal *
402  AddFaceTriangle(const PointIdentifier & aPid, const PointIdentifier & bPid, const PointIdentifier & cPid);
403 
405  virtual void
406  DeletePoint(const PointIdentifier & pid);
407 
408  virtual void
409  DeleteEdge(const PointIdentifier & orgPid, const PointIdentifier & destPid);
410 
411  virtual void
412  DeleteEdge(QEPrimal * e);
413 
414  virtual void
415  LightWeightDeleteEdge(EdgeCellType * edgeCell);
416 
417  virtual void
418  LightWeightDeleteEdge(QEPrimal * e);
419 
420  virtual void
421  DeleteFace(FaceRefType faceToDelete);
422 
423  //
424  bool
426  {
427  return (Superclass::GetPoint(pid, pt));
428  }
429 
430  virtual PointType
431  GetPoint(const PointIdentifier & pid) const;
432 
433  virtual VectorType
434  GetVector(const PointIdentifier & pid) const;
435 
436  virtual QEPrimal *
437  GetEdge() const;
438 
439  virtual QEPrimal *
440  GetEdge(const CellIdentifier & eid) const;
441 
442  virtual QEPrimal *
443  FindEdge(const PointIdentifier & pid0) const;
444 
445  virtual QEPrimal *
446  FindEdge(const PointIdentifier & pid0, const PointIdentifier & pid1) const;
447 
448  virtual EdgeCellType *
449  FindEdgeCell(const PointIdentifier & pid0, const PointIdentifier & pid1) const;
450 
452  CoordRepType
453  ComputeEdgeLength(QEPrimal * e);
454 
455  PointIdentifier
456  ComputeNumberOfPoints() const;
457 
458  CellIdentifier
459  ComputeNumberOfFaces() const;
460 
461  CellIdentifier
462  ComputeNumberOfEdges() const;
463 
464  PointIdentifier
465  Splice(QEPrimal * a, QEPrimal * b);
466 
467 #ifdef ITK_USE_CONCEPT_CHECKING
468  // Begin concept checking
469  // End concept checking
470 #endif
471 
472  // for reusability of a mesh in the MeshToMesh filter
473  void
475  {
476  while (!this->m_FreePointIndexes.empty())
477  {
478  this->m_FreePointIndexes.pop();
479  }
480  while (!this->m_FreeCellIndexes.empty())
481  {
482  this->m_FreeCellIndexes.pop();
483  }
484  }
485 
486  CellIdentifier
488  {
489  return (m_NumberOfFaces);
490  }
491  CellIdentifier
493  {
494  return (m_NumberOfEdges);
495  }
496 
497 protected:
499  QuadEdgeMesh();
500  ~QuadEdgeMesh() override;
504  virtual void
505  ClearCellsContainer();
506 
507  CellsContainerPointer m_EdgeCellsContainer{};
508 
509 private:
510  CellIdentifier m_NumberOfFaces{};
511  CellIdentifier m_NumberOfEdges{};
512 
513 protected:
514  FreePointIndexesType m_FreePointIndexes{};
515  FreeCellIndexesType m_FreeCellIndexes{};
516 };
517 } // namespace itk
518 
519 #ifndef ITK_MANUAL_INSTANTIATION
520 # include "itkQuadEdgeMesh.hxx"
521 #endif
522 
523 #endif
itk::QuadEdgeMesh::GetCellBoundaryFeatureNeighbors
CellIdentifier GetCellBoundaryFeatureNeighbors(int dimension, CellIdentifier cellId, CellFeatureIdentifier featureId, std::set< CellIdentifier > *cellSet)
Definition: itkQuadEdgeMesh.h:323
itk::QuadEdgeMesh::PixelType
TPixel PixelType
Definition: itkQuadEdgeMesh.h:60
itk::QuadEdgeMesh::GetAssignedCellBoundaryIfOneExists
bool GetAssignedCellBoundaryIfOneExists(int dimension, CellIdentifier cellId, CellFeatureIdentifier featureId, CellAutoPointer &cellAP) const
Definition: itkQuadEdgeMesh.h:345
itk::QuadEdgeMesh::FaceRefType
typename Traits::FaceRefType FaceRefType
Definition: itkQuadEdgeMesh.h:141
itk::QuadEdgeMesh::RequestedRegionIsOutsideOfTheBufferedRegion
bool RequestedRegionIsOutsideOfTheBufferedRegion() override
Definition: itkQuadEdgeMesh.h:179
itk::QuadEdgeMesh::DualDataType
typename Traits::DualDataType DualDataType
Definition: itkQuadEdgeMesh.h:134
itk::QuadEdgeMesh::GetCellNeighbors
CellIdentifier GetCellNeighbors(CellIdentifier, std::set< CellIdentifier > *)
Definition: itkQuadEdgeMesh.h:338
itk::QuadEdgeMesh::PrimalDataType
typename Traits::PrimalDataType PrimalDataType
Definition: itkQuadEdgeMesh.h:133
itk::QuadEdgeMesh::SetEdgeCell
void SetEdgeCell(CellIdentifier cellId, CellAutoPointer &cellPointer)
Definition: itkQuadEdgeMesh.h:207
itk::GTest::TypedefsAndConstructors::Dimension2::VectorType
ImageBaseType::SpacingType VectorType
Definition: itkGTestTypedefsAndConstructors.h:53
itk::GTest::TypedefsAndConstructors::Dimension2::PointType
ImageBaseType::PointType PointType
Definition: itkGTestTypedefsAndConstructors.h:51
itk::QuadEdgeMesh::QEDual
typename Traits::QEDual QEDual
Definition: itkQuadEdgeMesh.h:136
itkConceptChecking.h
itk::QuadEdgeMesh::Traits
TTraits Traits
Definition: itkQuadEdgeMesh.h:59
itk::SmartPointer< Self >
itk::QuadEdgeMesh::GetCellBoundaryFeature
bool GetCellBoundaryFeature(int dimension, CellIdentifier cellId, CellFeatureIdentifier featureId, CellAutoPointer &cellAP) const
Definition: itkQuadEdgeMesh.h:308
itk::QuadEdgeMesh::QEPrimal
typename Traits::QEPrimal QEPrimal
Definition: itkQuadEdgeMesh.h:135
itk::QuadEdgeMesh::m_NoFace
static const CellIdentifier m_NoFace
Definition: itkQuadEdgeMesh.h:163
itk::QuadEdgeMesh::RemoveBoundaryAssignment
bool RemoveBoundaryAssignment(int dimension, CellIdentifier cellId, CellFeatureIdentifier featureId)
Definition: itkQuadEdgeMesh.h:297
itk::MapContainer
A wrapper of the STL "map" container.
Definition: itkMapContainer.h:45
itk::QuadEdgeMesh::FreePointIndexesType
std::queue< PointIdentifier > FreePointIndexesType
Definition: itkQuadEdgeMesh.h:149
itk::Mesh< TPixel, VDimension, TTraits >::CellAutoPointer
typename CellType::CellAutoPointer CellAutoPointer
Definition: itkMesh.h:229
itk::Mesh< TPixel, VDimension, TTraits >::CellIdentifier
typename MeshTraits::CellIdentifier CellIdentifier
Definition: itkMesh.h:174
itk::QuadEdgeMesh::GetNumberOfFaces
CellIdentifier GetNumberOfFaces() const
Definition: itkQuadEdgeMesh.h:487
itk::QuadEdgeMesh::VertexRefType
typename Traits::VertexRefType VertexRefType
Definition: itkQuadEdgeMesh.h:140
itk::MeshEnums::MeshClassCellsAllocationMethod
MeshClassCellsAllocationMethod
Definition: itkCommonEnums.h:198
itk::Mesh< TPixel, VDimension, TTraits >::CellsContainer
typename MeshTraits::CellsContainer CellsContainer
Definition: itkMesh.h:180
itk::QuadEdgeMesh::EdgeListType
std::list< QEPrimal * > EdgeListType
Definition: itkQuadEdgeMesh.h:154
itk::PointSet< TPixel, VDimension, TTraits >::PointIdentifier
typename MeshTraits::PointIdentifier PointIdentifier
Definition: itkPointSet.h:105
itk::QuadEdgeMesh::BuildCellLinks
void BuildCellLinks() const
Definition: itkQuadEdgeMesh.h:233
itk::QuadEdgeMesh::PointIdIterator
typename CellTraits::PointIdIterator PointIdIterator
Definition: itkQuadEdgeMesh.h:81
itk::QuadEdgeMesh::GetEdgeCells
const CellsContainer * GetEdgeCells() const
Definition: itkQuadEdgeMesh.h:197
itk::QuadEdgeMesh::GetBoundaryAssignments
BoundaryAssignmentsContainerPointer GetBoundaryAssignments(int dimension)
Definition: itkQuadEdgeMesh.h:248
itk::QuadEdgeMesh::SetBoundaryAssignments
void SetBoundaryAssignments(int dimension, BoundaryAssignmentsContainer *container)
Definition: itkQuadEdgeMesh.h:239
itk::QuadEdgeMesh
Mesh class for 2D manifolds embedded in ND space.
Definition: itkQuadEdgeMesh.h:53
itk::QuadEdgeMesh::PointIdList
std::vector< PointIdentifier > PointIdList
Definition: itkQuadEdgeMesh.h:153
itk::QuadEdgeMesh::GetPoint
bool GetPoint(PointIdentifier pid, PointType *pt) const
Definition: itkQuadEdgeMesh.h:425
itk::GTest::TypedefsAndConstructors::Dimension2::RegionType
ImageBaseType::RegionType RegionType
Definition: itkGTestTypedefsAndConstructors.h:54
itk::QuadEdgeMeshPolygonCell
Definition: itkQuadEdgeMeshPolygonCell.h:39
itk::QuadEdgeMesh::PointIdInternalIterator
typename CellTraits::PointIdInternalIterator PointIdInternalIterator
Definition: itkQuadEdgeMesh.h:80
itk::QuadEdgeMesh::GetEdgeCells
CellsContainer * GetEdgeCells()
Definition: itkQuadEdgeMesh.h:192
itkMesh.h
itk::QuadEdgeMeshLineCell
Class that connects the QuadEdgeMesh with the Mesh.
Definition: itkQuadEdgeMeshLineCell.h:41
itkQuadEdgeMeshPolygonCell.h
itkQuadEdgeMeshFrontIterator.h
itk::PointSet< TPixel, VDimension, TTraits >::CoordRepType
typename MeshTraits::CoordRepType CoordRepType
Definition: itkPointSet.h:104
itk::QuadEdgeMesh::GetBoundaryAssignments
const BoundaryAssignmentsContainerPointer GetBoundaryAssignments(int dimension) const
Definition: itkQuadEdgeMesh.h:257
itk::QuadEdgeMesh::m_NoPoint
static const PointIdentifier m_NoPoint
Definition: itkQuadEdgeMesh.h:160
itk::QuadEdgeMesh::SetBoundaryAssignment
void SetBoundaryAssignment(int dimension, CellIdentifier cellId, CellFeatureIdentifier featureId, CellIdentifier boundaryId)
Definition: itkQuadEdgeMesh.h:268
itk::QuadEdgeMesh::CoordRepArrayType
CoordRepType[Self::PointDimension] CoordRepArrayType
Definition: itkQuadEdgeMesh.h:86
itk::QuadEdgeMesh::VectorType
typename Traits::VectorType VectorType
Definition: itkQuadEdgeMesh.h:142
itk::QuadEdgeMesh::FreeCellIndexesType
std::queue< CellIdentifier > FreeCellIndexesType
Definition: itkQuadEdgeMesh.h:150
itk::Mesh< TPixel, VDimension, TTraits >::CellFeatureIdentifier
typename MeshTraits::CellFeatureIdentifier CellFeatureIdentifier
Definition: itkMesh.h:175
itk::QuadEdgeMesh::EdgeListPointerType
EdgeListType * EdgeListPointerType
Definition: itkQuadEdgeMesh.h:155
itk::QuadEdgeMesh::GetNumberOfEdges
CellIdentifier GetNumberOfEdges() const
Definition: itkQuadEdgeMesh.h:492
itk
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
Definition: itkAnnulusOperator.h:24
itkQuadEdgeMeshLineCell.h
itk::Mesh
Implements the N-dimensional mesh structure.
Definition: itkMesh.h:126
itk::QuadEdgeMesh::SetEdgeCells
void SetEdgeCells(CellsContainer *edgeCells)
Definition: itkQuadEdgeMesh.h:202
itk::Object
Base class for most ITK classes.
Definition: itkObject.h:61
itk::Math::e
static constexpr double e
Definition: itkMath.h:56
itk::PointSet< TPixel, VDimension, TTraits >::PointType
typename MeshTraits::PointType PointType
Definition: itkPointSet.h:106
itk::QuadEdgeMesh::GetBoundaryAssignment
bool GetBoundaryAssignment(int dimension, CellIdentifier cellId, CellFeatureIdentifier featureId, CellIdentifier *boundaryId) const
Definition: itkQuadEdgeMesh.h:282
itkQEDefineFrontIteratorMethodsMacro
#define itkQEDefineFrontIteratorMethodsMacro(MeshTypeArg)
Definition: itkQuadEdgeMeshFrontIterator.h:24
itk::QuadEdgeMesh::QEType
typename Traits::QEPrimal QEType
Definition: itkQuadEdgeMesh.h:137
itk::QuadEdgeMesh::CopyInformation
void CopyInformation(const DataObject *data) override
Definition: itkQuadEdgeMesh.h:219
itk::QuadEdgeMesh::ClearFreePointAndCellIndexesLists
void ClearFreePointAndCellIndexesLists()
Definition: itkQuadEdgeMesh.h:474
itk::DataObject
Base class for all data objects in ITK.
Definition: itkDataObject.h:293
itkQuadEdgeMeshTraits.h