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
00096 template <
00097 typename TPixelType,
00098 unsigned int VDimension = 3,
00099 typename TMeshTraits = DefaultStaticMeshTraits< TPixelType , VDimension, VDimension >
00100 >
00101 class ITK_EXPORT Mesh : public PointSet<TPixelType, VDimension, TMeshTraits>
00102 {
00103 public:
00105 typedef Mesh Self;
00106 typedef PointSet<TPixelType, VDimension, TMeshTraits> Superclass;
00107 typedef SmartPointer<Self> Pointer;
00108 typedef SmartPointer<const Self> ConstPointer;
00109
00110 typedef typename Superclass::RegionType RegionType;
00111
00113 itkNewMacro(Self);
00114
00116 itkTypeMacro(Mesh, PointSet);
00117
00119 typedef TMeshTraits MeshTraits;
00120 typedef typename MeshTraits::PixelType PixelType;
00121 typedef typename MeshTraits::CellPixelType CellPixelType;
00122
00124 itkStaticConstMacro(PointDimension, unsigned int,
00125 TMeshTraits::PointDimension);
00126 itkStaticConstMacro(MaxTopologicalDimension, unsigned int,
00127 TMeshTraits::MaxTopologicalDimension);
00128
00131 typedef enum { CellsAllocationMethodUndefined,
00132 CellsAllocatedAsStaticArray,
00133 CellsAllocatedAsADynamicArray,
00134 CellsAllocatedDynamicallyCellByCell
00135 } CellsAllocationMethodType;
00136
00138 typedef typename MeshTraits::CoordRepType CoordRepType;
00139 typedef typename MeshTraits::InterpolationWeightType InterpolationWeightType;
00140 typedef typename MeshTraits::PointIdentifier PointIdentifier;
00141 typedef typename MeshTraits::CellIdentifier CellIdentifier;
00142 typedef typename MeshTraits::CellFeatureIdentifier CellFeatureIdentifier;
00143 typedef typename MeshTraits::PointType PointType;
00144 typedef typename MeshTraits::PointsContainer PointsContainer;
00145 typedef typename MeshTraits::CellTraits CellTraits;
00146 typedef typename MeshTraits::CellsContainer CellsContainer;
00147 typedef typename MeshTraits::PointCellLinksContainer PointCellLinksContainer;
00148 typedef typename MeshTraits::CellLinksContainer CellLinksContainer;
00149 typedef typename MeshTraits::PointDataContainer PointDataContainer;
00150 typedef typename MeshTraits::CellDataContainer CellDataContainer;
00151
00153 typedef PointLocator<PointIdentifier,itkGetStaticConstMacro(PointDimension),
00154 CoordRepType,PointsContainer> PointLocatorType;
00155 typedef BoundingBox<PointIdentifier,itkGetStaticConstMacro(PointDimension),
00156 CoordRepType,PointsContainer> BoundingBoxType;
00157
00159 typedef typename PointsContainer::Pointer PointsContainerPointer;
00160 typedef typename CellsContainer::Pointer CellsContainerPointer;
00161 typedef typename CellLinksContainer::Pointer CellLinksContainerPointer;
00162 typedef typename PointDataContainer::Pointer PointDataContainerPointer;
00163 typedef typename CellDataContainer::Pointer CellDataContainerPointer;
00164 typedef typename PointLocatorType::Pointer PointLocatorPointer;
00165 typedef typename BoundingBoxType::Pointer BoundingBoxPointer;
00166
00168 typedef typename
00169 PointsContainer::ConstIterator PointsContainerConstIterator;
00170 typedef typename
00171 PointsContainer::Iterator PointsContainerIterator;
00172 typedef typename
00173 CellsContainer::ConstIterator CellsContainerConstIterator;
00174 typedef typename
00175 CellsContainer::Iterator CellsContainerIterator;
00176 typedef typename
00177 CellLinksContainer::ConstIterator CellLinksContainerIterator;
00178 typedef typename
00179 PointDataContainer::ConstIterator PointDataContainerIterator;
00180 typedef typename
00181 CellDataContainer::ConstIterator CellDataContainerIterator;
00182 typedef typename
00183 PointCellLinksContainer::const_iterator PointCellLinksContainerIterator;
00184
00186 typedef CellFeatureIdentifier CellFeatureCount;
00187
00189 typedef CellInterface<CellPixelType,CellTraits> CellType;
00190 typedef typename CellType::CellAutoPointer CellAutoPointer;
00191
00193 typedef typename CellType::MultiVisitor CellMultiVisitorType;
00194
00195 protected:
00196
00197
00205 class BoundaryAssignmentIdentifier
00206 {
00207 public:
00209 typedef BoundaryAssignmentIdentifier Self;
00210
00213 BoundaryAssignmentIdentifier() {}
00214 BoundaryAssignmentIdentifier(CellIdentifier cellId,
00215 CellFeatureIdentifier featureId):
00216 m_CellId(cellId), m_FeatureId(featureId) {}
00217
00219 CellIdentifier m_CellId;
00220
00222 CellFeatureIdentifier m_FeatureId;
00223
00226 bool operator < (const Self& r) const
00227 {
00228 return ((m_CellId < r.m_CellId) ||
00229 ((m_CellId == r.m_CellId) && (m_FeatureId < r.m_FeatureId)));
00230 }
00231
00234 bool operator == (const Self& r) const
00235 {
00236 return ((m_CellId == r.m_CellId) && (m_FeatureId == r.m_FeatureId));
00237 }
00238 };
00239
00240
00243 CellsContainerPointer m_CellsContainer;
00244
00249 CellDataContainerPointer m_CellDataContainer;
00250
00254 CellLinksContainerPointer m_CellLinksContainer;
00255
00263 typedef MapContainer< BoundaryAssignmentIdentifier , CellIdentifier >
00264 BoundaryAssignmentsContainer;
00265 typedef typename BoundaryAssignmentsContainer::Pointer
00266 BoundaryAssignmentsContainerPointer;
00267 typedef std::vector< BoundaryAssignmentsContainerPointer >
00268 BoundaryAssignmentsContainerVector;
00269
00279 BoundaryAssignmentsContainerVector m_BoundaryAssignmentsContainers;
00280
00281 public:
00283 unsigned long GetNumberOfCells() const;
00284 void PassStructure(Self* inputMesh);
00285 virtual void Initialize();
00286
00291 void SetCellLinks(CellLinksContainer*);
00292 CellLinksContainerPointer GetCellLinks();
00293 const CellLinksContainerPointer GetCellLinks() const;
00294
00297 void SetCells(CellsContainer*);
00298 CellsContainerPointer GetCells();
00299 const CellsContainerPointer GetCells() const;
00300
00305 void SetCellData(CellDataContainer*);
00306 CellDataContainerPointer GetCellData();
00307 const CellDataContainerPointer GetCellData() const;
00308
00317 void SetBoundaryAssignments(int dimension,
00318 BoundaryAssignmentsContainer*);
00319 BoundaryAssignmentsContainerPointer GetBoundaryAssignments(int dimension);
00320 const BoundaryAssignmentsContainerPointer GetBoundaryAssignments(
00321 int dimension) const;
00322
00328 void SetCell(CellIdentifier, CellAutoPointer & );
00329 bool GetCell(CellIdentifier, CellAutoPointer & ) const;
00330
00333 void SetCellData(CellIdentifier, CellPixelType);
00334 bool GetCellData(CellIdentifier, CellPixelType*) const;
00335
00348 void SetBoundaryAssignment(int dimension, CellIdentifier cellId,
00349 CellFeatureIdentifier featureId,
00350 CellIdentifier boundaryId);
00351
00360 bool GetBoundaryAssignment(int dimension, CellIdentifier cellId,
00361 CellFeatureIdentifier featureId,
00362 CellIdentifier* boundaryId) const;
00363 bool RemoveBoundaryAssignment(int dimension, CellIdentifier cellId,
00364 CellFeatureIdentifier featureId);
00365
00367 CellFeatureCount GetNumberOfCellBoundaryFeatures(int dimension,
00368 CellIdentifier) const;
00369
00372 bool GetCellBoundaryFeature(int dimension, CellIdentifier,
00373 CellFeatureIdentifier, CellAutoPointer& ) const;
00374
00379 unsigned long GetCellBoundaryFeatureNeighbors(
00380 int dimension, CellIdentifier, CellFeatureIdentifier,
00381 std::set<CellIdentifier>* cellSet);
00382
00387 unsigned long GetCellNeighbors( CellIdentifier cellId,
00388 std::set<CellIdentifier>* cellSet );
00389
00397 bool GetAssignedCellBoundaryIfOneExists(int dimension, CellIdentifier,
00398 CellFeatureIdentifier,
00399 CellAutoPointer& ) const;
00400
00403 void BuildCellLinks();
00404
00408 BoundingBoxPointer GetCellBoundingBox(CellIdentifier cellId,
00409 BoundingBoxPointer bbox);
00410
00414 virtual void Accept(CellMultiVisitorType* mv);
00415
00417 virtual void UpdateOutputInformation();
00418 virtual void SetRequestedRegionToLargestPossibleRegion();
00419 virtual void CopyInformation(const DataObject *data);
00420 virtual bool RequestedRegionIsOutsideOfTheBufferedRegion();
00421 virtual bool VerifyRequestedRegion();
00422
00425 int GetMaximumNumberOfRegions() const
00426 {return m_MaximumNumberOfRegions;}
00427
00432 virtual void SetRequestedRegion(DataObject *data);
00433
00435 virtual void SetRequestedRegion( const RegionType & region );
00436 itkGetMacro( RequestedRegion, RegionType );
00437
00442 itkSetMacro( CellsAllocationMethod, CellsAllocationMethodType );
00443 itkGetConstMacro( CellsAllocationMethod, CellsAllocationMethodType );
00444
00445 protected:
00447 Mesh();
00448 ~Mesh();
00449 void PrintSelf(std::ostream& os, Indent indent) const;
00450
00454 void ReleaseCellsMemory();
00455
00456 private:
00457 Mesh(const Self&);
00458 void operator=(const Self&);
00459
00460 CellsAllocationMethodType m_CellsAllocationMethod;
00461
00462 };
00463
00464 }
00465
00466 #ifndef ITK_MANUAL_INSTANTIATION
00467 #include "itkMesh.txx"
00468 #endif
00469
00470 #endif
00471
00472
00473