00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __itkMesh_h
00021 #define __itkMesh_h
00022
00023 #if defined(_MSC_VER)
00024 #pragma warning ( disable : 4786 )
00025 #endif
00026
00027 #include "itkPointSet.h"
00028 #include "itkCellInterface.h"
00029 #include "itkMapContainer.h"
00030 #include <vector>
00031 #include <set>
00032
00033
00034 namespace itk
00035 {
00036
00043 template <typename TMesh>
00044 struct GetMeshDimension
00045 {
00046 itkStaticConstMacro(MaxTopologicalDimension, unsigned int, TMesh::MaxTopologicalDimension);
00047 itkStaticConstMacro(PointDimension, unsigned int, TMesh::PointDimension);
00048 };
00049
00050
00110 template <
00111 typename TPixelType,
00112 unsigned int VDimension = 3,
00113 typename TMeshTraits = DefaultStaticMeshTraits< TPixelType , VDimension, VDimension >
00114 >
00115 class ITK_EXPORT Mesh : public PointSet<TPixelType, VDimension, TMeshTraits>
00116 {
00117 public:
00119 typedef Mesh Self;
00120 typedef PointSet<TPixelType, VDimension, TMeshTraits> Superclass;
00121 typedef SmartPointer<Self> Pointer;
00122 typedef SmartPointer<const Self> ConstPointer;
00123
00124 typedef typename Superclass::RegionType RegionType;
00125
00127 itkNewMacro(Self);
00128
00130 itkTypeMacro(Mesh, PointSet);
00131
00133 typedef TMeshTraits MeshTraits;
00134 typedef typename MeshTraits::PixelType PixelType;
00135 typedef typename MeshTraits::CellPixelType CellPixelType;
00136
00138 itkStaticConstMacro(PointDimension, unsigned int,
00139 TMeshTraits::PointDimension);
00140 itkStaticConstMacro(MaxTopologicalDimension, unsigned int,
00141 TMeshTraits::MaxTopologicalDimension);
00142
00145 typedef enum { CellsAllocationMethodUndefined,
00146 CellsAllocatedAsStaticArray,
00147 CellsAllocatedAsADynamicArray,
00148 CellsAllocatedDynamicallyCellByCell
00149 } CellsAllocationMethodType;
00150
00152 typedef typename MeshTraits::CoordRepType CoordRepType;
00153 typedef typename MeshTraits::InterpolationWeightType InterpolationWeightType;
00154 typedef typename MeshTraits::PointIdentifier PointIdentifier;
00155 typedef typename MeshTraits::CellIdentifier CellIdentifier;
00156 typedef typename MeshTraits::CellFeatureIdentifier CellFeatureIdentifier;
00157 typedef typename MeshTraits::PointType PointType;
00158 typedef typename MeshTraits::PointsContainer PointsContainer;
00159 typedef typename MeshTraits::CellTraits CellTraits;
00160 typedef typename MeshTraits::CellsContainer CellsContainer;
00161 typedef typename MeshTraits::PointCellLinksContainer PointCellLinksContainer;
00162 typedef typename MeshTraits::CellLinksContainer CellLinksContainer;
00163 typedef typename MeshTraits::PointDataContainer PointDataContainer;
00164 typedef typename MeshTraits::CellDataContainer CellDataContainer;
00165
00167 typedef PointLocator<PointIdentifier,itkGetStaticConstMacro(PointDimension),
00168 CoordRepType,PointsContainer> PointLocatorType;
00169 typedef BoundingBox<PointIdentifier,itkGetStaticConstMacro(PointDimension),
00170 CoordRepType,PointsContainer> BoundingBoxType;
00171
00173 typedef typename PointsContainer::Pointer PointsContainerPointer;
00174 typedef typename CellsContainer::Pointer CellsContainerPointer;
00175 typedef typename CellLinksContainer::Pointer CellLinksContainerPointer;
00176 typedef typename PointDataContainer::Pointer PointDataContainerPointer;
00177 typedef typename CellDataContainer::Pointer CellDataContainerPointer;
00178 typedef typename PointLocatorType::Pointer PointLocatorPointer;
00179 typedef typename BoundingBoxType::Pointer BoundingBoxPointer;
00180
00182 typedef typename
00183 PointsContainer::ConstIterator PointsContainerConstIterator;
00184 typedef typename
00185 PointsContainer::Iterator PointsContainerIterator;
00186 typedef typename
00187 CellsContainer::ConstIterator CellsContainerConstIterator;
00188 typedef typename
00189 CellsContainer::Iterator CellsContainerIterator;
00190 typedef typename
00191 CellLinksContainer::ConstIterator CellLinksContainerIterator;
00192 typedef typename
00193 PointDataContainer::ConstIterator PointDataContainerIterator;
00194 typedef typename
00195 CellDataContainer::ConstIterator CellDataContainerIterator;
00196 typedef typename
00197 PointCellLinksContainer::const_iterator PointCellLinksContainerIterator;
00198
00200 typedef CellFeatureIdentifier CellFeatureCount;
00201
00203 typedef CellInterface<CellPixelType,CellTraits> CellType;
00204 typedef typename CellType::CellAutoPointer CellAutoPointer;
00205
00207 typedef typename CellType::MultiVisitor CellMultiVisitorType;
00208
00209
00210
00218 class BoundaryAssignmentIdentifier
00219 {
00220 public:
00222 typedef BoundaryAssignmentIdentifier Self;
00223
00226 BoundaryAssignmentIdentifier() {}
00227 BoundaryAssignmentIdentifier(CellIdentifier cellId,
00228 CellFeatureIdentifier featureId):
00229 m_CellId(cellId), m_FeatureId(featureId) {}
00230
00232 CellIdentifier m_CellId;
00233
00235 CellFeatureIdentifier m_FeatureId;
00236
00239 bool operator < (const Self& r) const
00240 {
00241 return ((m_CellId < r.m_CellId) ||
00242 ((m_CellId == r.m_CellId) && (m_FeatureId < r.m_FeatureId)));
00243 }
00244
00247 bool operator == (const Self& r) const
00248 {
00249 return ((m_CellId == r.m_CellId) && (m_FeatureId == r.m_FeatureId));
00250 }
00251 };
00252
00253
00261 typedef MapContainer< BoundaryAssignmentIdentifier , CellIdentifier >
00262 BoundaryAssignmentsContainer;
00263 typedef typename BoundaryAssignmentsContainer::Pointer
00264 BoundaryAssignmentsContainerPointer;
00265 typedef std::vector< BoundaryAssignmentsContainerPointer >
00266 BoundaryAssignmentsContainerVector;
00267
00268
00269 protected:
00270
00273 CellsContainerPointer m_CellsContainer;
00274
00279 CellDataContainerPointer m_CellDataContainer;
00280
00284 CellLinksContainerPointer m_CellLinksContainer;
00285
00295 BoundaryAssignmentsContainerVector m_BoundaryAssignmentsContainers;
00296
00297 public:
00299 unsigned long GetNumberOfCells() const;
00300 void PassStructure(Self* inputMesh);
00301 virtual void Initialize();
00302
00307 void SetCellLinks(CellLinksContainer*);
00308 CellLinksContainerPointer GetCellLinks();
00309 const CellLinksContainerPointer GetCellLinks() const;
00310
00313 void SetCells(CellsContainer*);
00314 CellsContainerPointer GetCells();
00315 const CellsContainerPointer GetCells() const;
00316
00321 void SetCellData(CellDataContainer*);
00322 CellDataContainerPointer GetCellData();
00323 const CellDataContainerPointer GetCellData() const;
00324
00333 void SetBoundaryAssignments(int dimension,
00334 BoundaryAssignmentsContainer*);
00335 BoundaryAssignmentsContainerPointer GetBoundaryAssignments(int dimension);
00336 const BoundaryAssignmentsContainerPointer GetBoundaryAssignments(
00337 int dimension) const;
00338
00344 void SetCell(CellIdentifier, CellAutoPointer & );
00345 bool GetCell(CellIdentifier, CellAutoPointer & ) const;
00346
00349 void SetCellData(CellIdentifier, CellPixelType);
00350 bool GetCellData(CellIdentifier, CellPixelType*) const;
00351
00364 void SetBoundaryAssignment(int dimension, CellIdentifier cellId,
00365 CellFeatureIdentifier featureId,
00366 CellIdentifier boundaryId);
00367
00376 bool GetBoundaryAssignment(int dimension, CellIdentifier cellId,
00377 CellFeatureIdentifier featureId,
00378 CellIdentifier* boundaryId) const;
00379 bool RemoveBoundaryAssignment(int dimension, CellIdentifier cellId,
00380 CellFeatureIdentifier featureId);
00381
00383 CellFeatureCount GetNumberOfCellBoundaryFeatures(int dimension,
00384 CellIdentifier) const;
00385
00388 bool GetCellBoundaryFeature(int dimension, CellIdentifier,
00389 CellFeatureIdentifier, CellAutoPointer& ) const;
00390
00395 unsigned long GetCellBoundaryFeatureNeighbors(
00396 int dimension, CellIdentifier, CellFeatureIdentifier,
00397 std::set<CellIdentifier>* cellSet);
00398
00403 unsigned long GetCellNeighbors( CellIdentifier cellId,
00404 std::set<CellIdentifier>* cellSet );
00405
00413 bool GetAssignedCellBoundaryIfOneExists(int dimension, CellIdentifier,
00414 CellFeatureIdentifier,
00415 CellAutoPointer& ) const;
00416
00419 void BuildCellLinks();
00420
00424 BoundingBoxPointer GetCellBoundingBox(CellIdentifier cellId,
00425 BoundingBoxPointer bbox);
00426
00430 virtual void Accept(CellMultiVisitorType* mv);
00431
00433 virtual void UpdateOutputInformation();
00434 virtual void SetRequestedRegionToLargestPossibleRegion();
00435 virtual void CopyInformation(const DataObject *data);
00436 virtual bool RequestedRegionIsOutsideOfTheBufferedRegion();
00437 virtual bool VerifyRequestedRegion();
00438
00441 int GetMaximumNumberOfRegions() const
00442 {return m_MaximumNumberOfRegions;}
00443
00448 virtual void SetRequestedRegion(DataObject *data);
00449
00451 virtual void SetRequestedRegion( const RegionType & region );
00452 itkGetMacro( RequestedRegion, RegionType );
00453
00458 itkSetMacro( CellsAllocationMethod, CellsAllocationMethodType );
00459 itkGetConstMacro( CellsAllocationMethod, CellsAllocationMethodType );
00460
00461 protected:
00463 Mesh();
00464 ~Mesh();
00465 void PrintSelf(std::ostream& os, Indent indent) const;
00466
00470 void ReleaseCellsMemory();
00471
00472 private:
00473 Mesh(const Self&);
00474 void operator=(const Self&);
00475
00476 CellsAllocationMethodType m_CellsAllocationMethod;
00477
00478 };
00479
00480 }
00481
00482 #ifndef ITK_MANUAL_INSTANTIATION
00483 #include "itkMesh.txx"
00484 #endif
00485
00486 #endif
00487
00488
00489