/usr/include/InsightToolkit/Common/itkMesh.h is in libinsighttoolkit3-dev 3.20.1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 | /*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: itkMesh.h
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Insight Software Consortium. All rights reserved.
See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
Portions of this code are covered under the VTK copyright.
See VTKCopyright.txt or http://www.kitware.com/VTKCopyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef __itkMesh_h
#define __itkMesh_h
#if defined(_MSC_VER)
#pragma warning ( disable : 4786 )
#endif
#include "itkPointSet.h"
#include "itkCellInterface.h"
#include "itkMapContainer.h"
#include <vector>
#include <set>
namespace itk
{
/**
* Due to a bug in MSVC, an enum value cannot be accessed out of a template
* parameter until the template class opens. In order for templated classes
* to access the dimension of an image template parameter in defining their
* own dimension, this class is needed as a work-around.
*/
template <typename TMesh>
struct GetMeshDimension
{
itkStaticConstMacro(MaxTopologicalDimension, unsigned int, TMesh::MaxTopologicalDimension);
itkStaticConstMacro(PointDimension, unsigned int, TMesh::PointDimension);
};
/** \class Mesh
* \brief Implements the N-dimensional mesh structure.
*
* \par Overview
* Mesh implements the N-dimensional mesh structure for ITK. It provides
* an API to perform operations on points, cells, boundaries, etc., but
* does not tie down the underlying implementation and storage. A
* "MeshTraits" structure is used to define the container and identifier
* types that will be used to access the mesh. See DefaultStaticMeshTraits
* for the set of type definitions needed. All types that are defined
* in the "MeshTraits" structure will have duplicate typedefs in the resulting
* mesh itself.
*
* Mesh is an adaptive, evolving structure. Typically points and cells
* are created, with the cells referring to their defining points. If
* additional topological information is required, then BuildCellLinks() is
* called and links from the points back to the cells that use them are
* created. This allows implicit topological information about the faces
* and edges of the cells to be determined. (For example, a "face" neighbor
* to a cell can be determined by intersection the sets of cells that use
* the points defining the face. This is an inherent assumption on the
* manifold relationship of the cells in the mesh.) In some cases, either
* because the mesh is non-manifold, because we wish to explicitly store
* information with the faces and edges of the mesh, or because performance
* requirements demand that boundaries are explicitly represented (the set
* intersection does not need to be performed); then Mesh can be further
* extended by adding explicit boundary assignments.
*
* \par Usage
* Mesh has three template parameters. The first is the pixel type, or the
* type of data stored (optionally) with points, cells, and/or boundaries.
* The second is the geometric dimension of the points defining the mesh. This
* also limits the maximum topological dimension of the cells that can be
* inserted. The third template parameter is the "MeshTraits" structure
* controlling type information for the mesh. Most users will be happy
* with the defaults, and will not have to worry about this third argument.
*
* One of the most important parts of using this mesh is how to create
* cells to insert into it. The cells for the mesh take two template
* parameters. The first is the pixel type, and should correspond
* exactly to that type given to the mesh. The second is a
* "CellTraits" which holds a sub-set of the "MeshTraits" structure
* definitions, and is also a member of them. Any cell which is to be
* inserted to a mesh should have MeshTraits::CellTraits as its second
* template parameter.
*
* Template parameters for Mesh:
*
* TPixelType =
* The type stored as data for an entity (cell, point, or boundary).
*
* TMeshTraits =
* Type information structure for the mesh.
*
* \par References
* No reference information is available.
*
* \ingroup MeshObjects
*/
template <
typename TPixelType,
unsigned int VDimension = 3,
typename TMeshTraits = DefaultStaticMeshTraits< TPixelType , VDimension, VDimension >
>
class ITK_EXPORT Mesh : public PointSet<TPixelType, VDimension, TMeshTraits>
{
public:
/** Standard typedefs. */
typedef Mesh Self;
typedef PointSet<TPixelType, VDimension, TMeshTraits> Superclass;
typedef SmartPointer<Self> Pointer;
typedef SmartPointer<const Self> ConstPointer;
typedef typename Superclass::RegionType RegionType;
/** Method for creation through the object factory. */
itkNewMacro(Self);
/** Standard part of every itk Object. */
itkTypeMacro(Mesh, PointSet);
/** Hold on to the type information specified by the template parameters. */
typedef TMeshTraits MeshTraits;
typedef typename MeshTraits::PixelType PixelType;
typedef typename MeshTraits::CellPixelType CellPixelType;
/** Convenient constants obtained from TMeshTraits template parameter. */
itkStaticConstMacro(PointDimension, unsigned int,
TMeshTraits::PointDimension);
itkStaticConstMacro(MaxTopologicalDimension, unsigned int,
TMeshTraits::MaxTopologicalDimension);
/** Enum defining the possible methods used to allocate memory for
* the Cells */
typedef enum { CellsAllocationMethodUndefined,
CellsAllocatedAsStaticArray,
CellsAllocatedAsADynamicArray,
CellsAllocatedDynamicallyCellByCell
} CellsAllocationMethodType;
/** Convenient typedefs obtained from TMeshTraits template parameter. */
typedef typename MeshTraits::CoordRepType CoordRepType;
typedef typename MeshTraits::InterpolationWeightType InterpolationWeightType;
typedef typename MeshTraits::PointIdentifier PointIdentifier;
typedef typename MeshTraits::CellIdentifier CellIdentifier;
typedef typename MeshTraits::CellFeatureIdentifier CellFeatureIdentifier;
typedef typename MeshTraits::PointHashType PointHashType;
typedef typename MeshTraits::PointType PointType;
typedef typename MeshTraits::PointsContainer PointsContainer;
typedef typename MeshTraits::CellTraits CellTraits;
typedef typename MeshTraits::CellsContainer CellsContainer;
typedef typename MeshTraits::PointCellLinksContainer PointCellLinksContainer;
typedef typename MeshTraits::CellLinksContainer CellLinksContainer;
typedef typename MeshTraits::PointDataContainer PointDataContainer;
typedef typename MeshTraits::CellDataContainer CellDataContainer;
/** Used to support geometric operations on the toolkit. */
typedef PointLocator<PointIdentifier,itkGetStaticConstMacro(PointDimension),
CoordRepType,PointsContainer> PointLocatorType;
typedef BoundingBox<PointIdentifier,itkGetStaticConstMacro(PointDimension),
CoordRepType,PointsContainer> BoundingBoxType;
/** Create types that are pointers to each of the container types. */
typedef typename PointsContainer::Pointer PointsContainerPointer;
typedef typename CellsContainer::Pointer CellsContainerPointer;
typedef typename CellsContainer::ConstPointer CellsContainerConstPointer;
typedef typename CellLinksContainer::Pointer CellLinksContainerPointer;
typedef typename PointDataContainer::Pointer PointDataContainerPointer;
typedef typename CellDataContainer::Pointer CellDataContainerPointer;
typedef typename CellDataContainer::ConstPointer CellDataContainerConstPointer;
typedef typename PointLocatorType::Pointer PointLocatorPointer;
typedef typename BoundingBoxType::Pointer BoundingBoxPointer;
typedef typename CellLinksContainer::ConstPointer CellLinksContainerConstPointer;
/** Create types that are iterators for each of the container types. */
typedef typename
PointsContainer::ConstIterator PointsContainerConstIterator;
typedef typename
PointsContainer::Iterator PointsContainerIterator;
typedef typename
CellsContainer::ConstIterator CellsContainerConstIterator;
typedef typename
CellsContainer::Iterator CellsContainerIterator;
typedef typename
CellLinksContainer::ConstIterator CellLinksContainerIterator;
typedef typename
PointDataContainer::ConstIterator PointDataContainerIterator;
typedef typename
CellDataContainer::ConstIterator CellDataContainerIterator;
typedef typename
PointCellLinksContainer::const_iterator PointCellLinksContainerIterator;
/** A useful rename. */
typedef CellFeatureIdentifier CellFeatureCount;
/** The base cell type for cells in this mesh. */
typedef CellInterface<CellPixelType,CellTraits> CellType;
typedef typename CellType::CellAutoPointer CellAutoPointer;
/** Visiting cells. */
typedef typename CellType::MultiVisitor CellMultiVisitorType;
/** \class BoundaryAssignmentIdentifier
* An explicit cell boundary assignment can be accessed through the cell
* identifier to which the assignment is made, and the feature Id of the
* boundary feature within the cell that is being assigned.
*
* This class provides a pair of these identifiers with appropriate
* comparison operators available for use of the Ids in sorted container
* classes. */
class BoundaryAssignmentIdentifier
{
public:
/** Create an alias to BoundaryAssignmentIdentifier. */
typedef BoundaryAssignmentIdentifier Self;
/** Constructor just takes the cell and feature identifiers, or defaults
* to their individual default values. */
BoundaryAssignmentIdentifier() {}
BoundaryAssignmentIdentifier(CellIdentifier cellId,
CellFeatureIdentifier featureId):
m_CellId(cellId), m_FeatureId(featureId) {}
/** The Cell's identification. */
CellIdentifier m_CellId;
/** The identification of the feature within the cell. */
CellFeatureIdentifier m_FeatureId;
/** Most containers require a "<" operator to be defined for their key
* types. */
bool operator < (const Self& r) const
{
return ((m_CellId < r.m_CellId) ||
((m_CellId == r.m_CellId) && (m_FeatureId < r.m_FeatureId)));
}
/** Most containers require a "==" operator to be defined for their key
* types. */
bool operator == (const Self& r) const
{
return ((m_CellId == r.m_CellId) && (m_FeatureId == r.m_FeatureId));
}
}; // End Class: Mesh::BoundaryAssignmentIdentifier
/** Used for manipulating boundaries and boundary attributes. A
* BoundaryAssignmentsContainerVector is indexed by dimension. For
* each dimension, it points to a MapContainer indexed by a
* BoundaryAssignmentIdentifier, which encapsulates a cell
* identifier and a boundary feature identifier. The boundary
* feature identifier distinguishes different boundary features for
* a given cell at a given dimension. */
typedef MapContainer< BoundaryAssignmentIdentifier , CellIdentifier >
BoundaryAssignmentsContainer;
typedef typename BoundaryAssignmentsContainer::Pointer
BoundaryAssignmentsContainerPointer;
typedef std::vector< BoundaryAssignmentsContainerPointer >
BoundaryAssignmentsContainerVector;
protected:
/** Holds cells used by the mesh. Individual cells are accessed
* through cell identifiers. */
CellsContainerPointer m_CellsContainer;
/** An object containing data associated with the mesh's cells.
* Optionally, this can be NULL, indicating that no data are associated
* with the cells. The data for a cell can be accessed through its cell
* identifier. */
CellDataContainerPointer m_CellDataContainer;
/** An object containing parent cell links for each point. Since a point
* can be used by multiple cells, each point identifier accesses another
* container which holds the cell identifiers */
mutable CellLinksContainerPointer m_CellLinksContainer;
/** A vector of objects containing explicit cell boundary assignments.
* The vector is indexed by the topological dimension of the cell
* boundary. The container for each topological dimension holds
* boundary identifiers of the assigned boundaries. The containers are
* keyed by BoundaryAssignmentIdentifier objects (see above). The
* boundary identifiers can be used to access the boundaries themselves
* in the containers stored in the Boundaries vector. They can also be
* used to access the data stored by a particular boundary through the
* containers in the BoundaryData vector. */
BoundaryAssignmentsContainerVector m_BoundaryAssignmentsContainers;
public:
/** Mesh-level operation interface. */
unsigned long GetNumberOfCells() const;
void PassStructure(Self* inputMesh);
virtual void Initialize();
/** Methods for managing Mesh filters that have internal mini-pipelines */
virtual void CopyInformation(const DataObject *data);
virtual void Graft(const DataObject *data);
/** Access m_CellsLinksContainer, which contains parent cell links
* for each point. Since a point can be used by multiple cells,
* each point identifier accesses another container which holds the
* cell identifiers */
void SetCellLinks(CellLinksContainer*);
#ifndef CABLE_CONFIGURATION
CellLinksContainer * GetCellLinks();
const CellLinksContainer * GetCellLinks() const;
/** Access m_CellsContainer, which holds cells used by the mesh.
* Individual cells are accessed through cell identifiers. */
void SetCells(CellsContainer*);
CellsContainer * GetCells();
const CellsContainer * GetCells() const;
#endif
/** Access m_CellDataContainer, which contains data associated with
* the mesh's cells. Optionally, this can be NULL, indicating that
* no data are associated with the cells. The data for a cell can
* be accessed through its cell identifier. */
void SetCellData(CellDataContainer*);
CellDataContainer * GetCellData();
const CellDataContainer * GetCellData() const;
/**
* Set/get the BoundaryAssignmentsContainer for a given dimension.
* The BoundaryAssignmentsContainer is a MapContainer indexed by a
* BoundaryAssignmentIdentifier, which encapsulates a cell
* identifier and a boundary feature identifier. The boundary
* feature identifier distinguishes different boundary features for
* a given cell at a given dimension.
*/
#if !defined(CABLE_CONFIGURATION)
void SetBoundaryAssignments(int dimension,
BoundaryAssignmentsContainer*);
#endif
#ifndef CABLE_CONFIGURATION
BoundaryAssignmentsContainerPointer GetBoundaryAssignments(int dimension);
const BoundaryAssignmentsContainerPointer GetBoundaryAssignments(
int dimension) const;
/** Access routines to fill the Cells container (m_CellsContainer),
* and get information from it. If SetCell is used to overwrite a
* cell currently in the mesh, it is the caller's responsibility to
* release the memory for the cell currently at the CellIdentifier
* position prior to calling SetCell. */
void SetCell(CellIdentifier, CellAutoPointer & );
bool GetCell(CellIdentifier, CellAutoPointer & ) const;
#endif
/** Access routines to fill the CellData container, and get information
* from it. */
void SetCellData(CellIdentifier, CellPixelType);
bool GetCellData(CellIdentifier, CellPixelType*) const;
/**
* Explicitly assign \a boundaryId as a part of the boundary of \a
* cellId. The identifiers \a boundaryId and \a cellId must
* identify cell objects already in the mesh. The dimension of \a
* boundaryId must be specified by \a dimension, and a unique
* CellFeatureIdentifier \a featureId must be assigned for each
* distinct boundary feature of a given dimension.
* CellFeatureIdentifier is equivalent to <tt>unsigned long</tt> by
* default, and this typedef will not typically need to be changed.
* The UsingCells list of \a boundaryId is automatically updated to
* include \a cellId.
*/
void SetBoundaryAssignment(int dimension, CellIdentifier cellId,
CellFeatureIdentifier featureId,
CellIdentifier boundaryId);
/** For the given cellId, get the identifier of a particular
* boundary feature of the given dimension. The featureId
* determines which boundary feature of the specified dimension is
* returned. For instance, if dimension is 1 and featureId is 0,
* then GetBoundaryAssignment finds the 0th edge of the given cell.
* The return value indicates whether a feature of the appropriate
* dimension and featureId exists. If it does not, the
* BoundaryIdentifier pointer is left unchanged. */
bool GetBoundaryAssignment(int dimension, CellIdentifier cellId,
CellFeatureIdentifier featureId,
CellIdentifier* boundaryId) const;
bool RemoveBoundaryAssignment(int dimension, CellIdentifier cellId,
CellFeatureIdentifier featureId);
/** Interface to cells. */
CellFeatureCount GetNumberOfCellBoundaryFeatures(int dimension,
CellIdentifier) const;
#ifndef CABLE_CONFIGURATION
/** Get the boundary feature of the given dimension of the given cell
* corresponding to the given feature identifier. */
bool GetCellBoundaryFeature(int dimension, CellIdentifier,
CellFeatureIdentifier, CellAutoPointer& ) const;
#endif
/** Get the set of cells neighboring the given cell across the given boundary
* feature. Returns the number of neighbors found. If cellSet is not NULL,
* the set of cell pointers is filled in with identifiers of the neighboring
* cells. */
unsigned long GetCellBoundaryFeatureNeighbors(
int dimension, CellIdentifier, CellFeatureIdentifier,
std::set<CellIdentifier>* cellSet);
/** Get the set of cells having the given cell as part of their
* boundary. Returns the number of neighbors found. If cellSet is
* not NULL, the set of cell pointers is filled in with identifiers
* of the neighboring cells. */
unsigned long GetCellNeighbors( CellIdentifier cellId,
std::set<CellIdentifier>* cellSet );
#ifndef CABLE_CONFIGURATION
/**
* Check if there is an explicitly assigned boundary feature for the
* given dimension and cell- and cell-feature-identifiers. If there
* is, a pointer to it is given back through \a boundary (if \a
* boundary != NULL) and \c true is returned. Otherwise, \c false is
* returned.
*/
bool GetAssignedCellBoundaryIfOneExists(int dimension, CellIdentifier,
CellFeatureIdentifier,
CellAutoPointer& ) const;
#endif
/** Dynamically build the links from points back to their using cells. This
* information is stored in the cell links container, not in the points. */
void BuildCellLinks() const;
#ifndef CABLE_CONFIGURATION
/** Get the bounding box of a cell in the mesh. The user
* must supply the bounding box. The methods return a pointer to
* the user-supplied bounding box as a convenience. */
BoundingBoxPointer GetCellBoundingBox(CellIdentifier cellId,
BoundingBoxPointer bbox);
/** This method iterates over all the cells in the mesh and has
* each cell Accept the MultiVisitor. See MultiVisitor for more
* information. (Note, this follows the Visitor Design Pattern.) */
virtual void Accept(CellMultiVisitorType* mv) const;
#endif
/** Set/Get the identification of the method used to allocate cells
\warning Failure to call this method correctly will lead to memory leaks
and/or segmentation faults because the cell memory will not be erased or
will be erased with an improper method. */
itkSetMacro( CellsAllocationMethod, CellsAllocationMethodType );
itkGetConstReferenceMacro( CellsAllocationMethod, CellsAllocationMethodType );
protected:
/** Constructor for use by New() method. */
Mesh();
~Mesh();
void PrintSelf(std::ostream& os, Indent indent) const;
/** Release the memory allocated for the cells pointers. This is done
based on information provided by the user through the method
SetCellsAllocationMethod() */
void ReleaseCellsMemory();
private:
Mesh(const Self&); //purposely not implemented
void operator=(const Self&); //purposely not implemented
CellsAllocationMethodType m_CellsAllocationMethod;
}; // End Class: Mesh
} // end namespace itk
#ifndef ITK_MANUAL_INSTANTIATION
#ifndef CABLE_CONFIGURATION
#include "itkMesh.txx"
#endif
#endif
#endif
|