You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
583 lines
18 KiB
C
583 lines
18 KiB
C
|
3 weeks ago
|
/*=========================================================================
|
||
|
|
|
||
|
|
Program: Visualization Toolkit
|
||
|
|
Module: vtkHyperTreeGrid.h
|
||
|
|
|
||
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
||
|
|
All rights reserved.
|
||
|
|
See Copyright.txt or http://www.kitware.com/Copyright.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 notice for more information.
|
||
|
|
|
||
|
|
=========================================================================*/
|
||
|
|
/**
|
||
|
|
* @class vtkHyperTreeGrid
|
||
|
|
* @brief A dataset containing a grid of vtkHyperTree instances
|
||
|
|
* arranged as a rectilinear grid.
|
||
|
|
*
|
||
|
|
*
|
||
|
|
* An hypertree grid is a dataset containing a rectilinear grid of root nodes,
|
||
|
|
* each of which can be refined as a vtkHyperTree grid. This organization of the
|
||
|
|
* root nodes allows for the definition of tree-based AMR grids that do not have
|
||
|
|
* uniform geometry.
|
||
|
|
* Some filters can be applied on this dataset: contour, outline, geometry.
|
||
|
|
*
|
||
|
|
* @warning
|
||
|
|
* It is not a spatial search object. If you are looking for this kind of
|
||
|
|
* octree see vtkCellLocator instead.
|
||
|
|
* Extent support is not finished yet.
|
||
|
|
*
|
||
|
|
* @sa
|
||
|
|
* vtkHyperTree vtkRectilinearGrid
|
||
|
|
*
|
||
|
|
* @par Thanks:
|
||
|
|
* This class was written by Philippe Pebay, Joachim Pouderoux and Charles Law,
|
||
|
|
* Kitware 2013
|
||
|
|
* This work was supported in part by Commissariat a l'Energie Atomique (CEA/DIF)
|
||
|
|
*/
|
||
|
|
|
||
|
|
#ifndef vtkHyperTreeGrid_h
|
||
|
|
#define vtkHyperTreeGrid_h
|
||
|
|
|
||
|
|
#include "vtkCommonDataModelModule.h" // For export macro
|
||
|
|
#include "vtkDataSet.h"
|
||
|
|
#include <map> // STL header for dual point coordinates ajustment
|
||
|
|
|
||
|
|
class vtkHyperTreeCursor;
|
||
|
|
class vtkHyperTree;
|
||
|
|
|
||
|
|
class vtkBitArray;
|
||
|
|
class vtkCellLinks;
|
||
|
|
class vtkCollection;
|
||
|
|
class vtkDataArray;
|
||
|
|
class vtkDataSetAttributes;
|
||
|
|
class vtkIdTypeArray;
|
||
|
|
class vtkLine;
|
||
|
|
class vtkPixel;
|
||
|
|
class vtkPoints;
|
||
|
|
class vtkVoxel;
|
||
|
|
|
||
|
|
class VTKCOMMONDATAMODEL_EXPORT vtkHyperTreeGrid : public vtkDataSet
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
|
||
|
|
class vtkHyperTreeSimpleCursor;
|
||
|
|
class vtkHyperTreeIterator;
|
||
|
|
struct vtkHyperTreeGridSuperCursor;
|
||
|
|
|
||
|
|
static vtkInformationIntegerKey* LEVELS();
|
||
|
|
static vtkInformationIntegerKey* DIMENSION();
|
||
|
|
static vtkInformationDoubleVectorKey* SIZES();
|
||
|
|
static vtkHyperTreeGrid* New();
|
||
|
|
|
||
|
|
vtkTypeMacro(vtkHyperTreeGrid, vtkDataSet);
|
||
|
|
void PrintSelf( ostream&, vtkIndent ) VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Return what type of dataset this is.
|
||
|
|
*/
|
||
|
|
int GetDataObjectType() VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Copy the internal geometric and topological structure of a
|
||
|
|
* vtkHyperTreeGrid object.
|
||
|
|
*/
|
||
|
|
void CopyStructure( vtkDataSet* ) VTK_OVERRIDE;
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Set/Get sizes of this rectilinear grid dataset
|
||
|
|
*/
|
||
|
|
void SetGridSize( unsigned int[3] );
|
||
|
|
void SetGridSize( unsigned int i, unsigned int j, unsigned int k );
|
||
|
|
vtkGetVector3Macro(GridSize, unsigned int);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Set/Get extent of this rectilinear grid dataset
|
||
|
|
*/
|
||
|
|
void SetGridExtent(int extent[6]);
|
||
|
|
void SetGridExtent(int iMin, int iMax, int jMin, int jMax,
|
||
|
|
int kMin, int kMax);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Specify whether indexing mode of grid root cells must be transposed to
|
||
|
|
* x-axis first, z-axis last, instead of the default z-axis first, k-axis last
|
||
|
|
*/
|
||
|
|
vtkSetMacro(TransposedRootIndexing, bool);
|
||
|
|
vtkGetMacro(TransposedRootIndexing, bool);
|
||
|
|
void SetIndexingModeToKJI()
|
||
|
|
{ this->SetTransposedRootIndexing( false ); }
|
||
|
|
void SetIndexingModeToIJK()
|
||
|
|
{ this->SetTransposedRootIndexing( true ); }
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Set/Get the subdivision factor in the grid refinement scheme
|
||
|
|
* NB: Can only be 2 or 3
|
||
|
|
*/
|
||
|
|
void SetBranchFactor( unsigned int );
|
||
|
|
vtkGetMacro(BranchFactor, unsigned int);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Set/Get the dimensionality of the grid
|
||
|
|
* NB: Can only be 1, 2 or 3
|
||
|
|
*/
|
||
|
|
void SetDimension( unsigned int );
|
||
|
|
vtkGetMacro(Dimension, unsigned int);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Return the number of cells in the dual grid.
|
||
|
|
*/
|
||
|
|
vtkIdType GetNumberOfCells() VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Return the number of points in the dual grid.
|
||
|
|
*/
|
||
|
|
vtkIdType GetNumberOfPoints() VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the number of leaves in the primal tree grid.
|
||
|
|
*/
|
||
|
|
vtkIdType GetNumberOfLeaves();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Return the number of levels in an individual (primal) tree
|
||
|
|
*/
|
||
|
|
vtkIdType GetNumberOfLevels( vtkIdType );
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Return the number of trees in the level 0 grid.
|
||
|
|
*/
|
||
|
|
vtkIdType GetNumberOfTrees();
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Specify the grid coordinates in the x-direction.
|
||
|
|
*/
|
||
|
|
void SetXCoordinates( vtkDataArray* );
|
||
|
|
vtkGetObjectMacro(XCoordinates, vtkDataArray);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Specify the grid coordinates in the y-direction.
|
||
|
|
*/
|
||
|
|
void SetYCoordinates( vtkDataArray* );
|
||
|
|
vtkGetObjectMacro(YCoordinates, vtkDataArray);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Specify the grid coordinates in the z-direction.
|
||
|
|
*/
|
||
|
|
void SetZCoordinates( vtkDataArray* );
|
||
|
|
vtkGetObjectMacro(ZCoordinates, vtkDataArray);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Specify the blanking mask of primal leaf cells
|
||
|
|
*/
|
||
|
|
void SetMaterialMask( vtkBitArray* );
|
||
|
|
vtkGetObjectMacro(MaterialMask, vtkBitArray);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Specify the visibility mask of primal leaf cells
|
||
|
|
*/
|
||
|
|
virtual void SetMaterialMaskIndex( vtkIdTypeArray* );
|
||
|
|
vtkGetObjectMacro(MaterialMaskIndex, vtkIdTypeArray);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* This method must be called once the tree settings change
|
||
|
|
*/
|
||
|
|
virtual void GenerateTrees();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Create a new cursor: an object that can traverse
|
||
|
|
* the cells of an individual hyper tree.
|
||
|
|
* \post result_exists: result!=0
|
||
|
|
*/
|
||
|
|
vtkHyperTreeCursor* NewCursor( vtkIdType );
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Subdivide node pointed by cursor, only if its a leaf.
|
||
|
|
* At the end, cursor points on the node that used to be leaf.
|
||
|
|
* \pre leaf_exists: leaf!=0
|
||
|
|
* \pre is_a_leaf: leaf->CurrentIsLeaf()
|
||
|
|
*/
|
||
|
|
void SubdivideLeaf( vtkHyperTreeCursor*, vtkIdType );
|
||
|
|
|
||
|
|
/**
|
||
|
|
* This method should be avoided in favor of cell/point iterators.
|
||
|
|
* Random access to points requires that arrays are created explicitly.
|
||
|
|
* Get point coordinates with ptId such that: 0 <= ptId < NumberOfPoints.
|
||
|
|
* THIS METHOD IS NOT THREAD SAFE.
|
||
|
|
*/
|
||
|
|
double* GetPoint( vtkIdType ) VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* This method should be avoided in favor of cell/point iterators.
|
||
|
|
* Random access to points requires that arrays are created explicitly.
|
||
|
|
* Copy point coordinates into user provided array x[3] for specified
|
||
|
|
* point id.
|
||
|
|
* THIS METHOD IS THREAD SAFE IF FIRST CALLED FROM A SINGLE THREAD AND
|
||
|
|
* THE DATASET IS NOT MODIFIED
|
||
|
|
*/
|
||
|
|
void GetPoint( vtkIdType, double[3] ) VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* This method should be avoided in favor of cell/point iterators.
|
||
|
|
* Random access to cells requires that connectivity arrays are created explicitly.
|
||
|
|
* Get cell with cellId such that: 0 <= cellId < NumberOfCells.
|
||
|
|
* THIS METHOD IS NOT THREAD SAFE.
|
||
|
|
*/
|
||
|
|
vtkCell* GetCell( vtkIdType ) VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* This method should be avoided in favor of cell/point iterators.
|
||
|
|
* Random access to cells requires that connectivity arrays are created explicitly.
|
||
|
|
* Get cell with cellId such that: 0 <= cellId < NumberOfCells.
|
||
|
|
* This is a thread-safe alternative to the previous GetCell()
|
||
|
|
* method.
|
||
|
|
* THIS METHOD IS THREAD SAFE IF FIRST CALLED FROM A SINGLE THREAD AND
|
||
|
|
* THE DATASET IS NOT MODIFIED
|
||
|
|
*/
|
||
|
|
void GetCell( vtkIdType, vtkGenericCell* ) VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* All cell types are 2: quadrilaters,3d: hexahedrons. They may be degenerate though.
|
||
|
|
* Get type of cell with cellId such that: 0 <= cellId < NumberOfCells.
|
||
|
|
* THIS METHOD IS THREAD SAFE IF FIRST CALLED FROM A SINGLE THREAD AND
|
||
|
|
* THE DATASET IS NOT MODIFIED
|
||
|
|
*/
|
||
|
|
int GetCellType( vtkIdType ) VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* This method should be avoided in favor of cell/point iterators.
|
||
|
|
* Random access to cells requires that connectivity arrays are created explicitly.
|
||
|
|
* Topological inquiry to get points defining cell.
|
||
|
|
* THIS METHOD IS THREAD SAFE IF FIRST CALLED FROM A SINGLE THREAD AND
|
||
|
|
* THE DATASET IS NOT MODIFIED
|
||
|
|
*/
|
||
|
|
void GetCellPoints( vtkIdType, vtkIdList* ) VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Return a pointer to a list of point ids defining cell.
|
||
|
|
* NB: More efficient than alternative method.
|
||
|
|
*/
|
||
|
|
virtual void GetCellPoints( vtkIdType, vtkIdType&, vtkIdType*& );
|
||
|
|
|
||
|
|
/**
|
||
|
|
* This method should be avoided in favor of cell/point iterators.
|
||
|
|
* Random access to cells requires that connectivity arrays are created explicitly.
|
||
|
|
* Topological inquiry to get cells using point.
|
||
|
|
* THIS METHOD IS THREAD SAFE IF FIRST CALLED FROM A SINGLE THREAD AND
|
||
|
|
* THE DATASET IS NOT MODIFIED
|
||
|
|
*/
|
||
|
|
void GetPointCells( vtkIdType, vtkIdList* ) VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* This method should be avoided in favor of cell/point iterators.
|
||
|
|
* Random access to cells requires that connectivity arrays are created explicitly.
|
||
|
|
* Topological inquiry to get all cells using list of points exclusive of
|
||
|
|
* cell specified (e.g., cellId). Note that the list consists of only
|
||
|
|
* cells that use ALL the points provided.
|
||
|
|
* This is exactly the same as GetCellNeighbors in unstructured grid.
|
||
|
|
* THIS METHOD IS THREAD SAFE IF FIRST CALLED FROM A SINGLE THREAD AND
|
||
|
|
* THE DATASET IS NOT MODIFIED
|
||
|
|
*/
|
||
|
|
void GetCellNeighbors( vtkIdType, vtkIdList*, vtkIdList* ) VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Find cell to which this point belongs, or at least closest one,
|
||
|
|
* even if the point is outside the grid.
|
||
|
|
* Since dual points are leaves, use the structure of the Tree instead
|
||
|
|
* of a point locator.
|
||
|
|
*/
|
||
|
|
vtkIdType FindPoint( double x[3] ) VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Locate cell based on global coordinate x and tolerance
|
||
|
|
* squared. If cell and cellId is non-NULL, then search starts from
|
||
|
|
* this cell and looks at immediate neighbors. Returns cellId >= 0
|
||
|
|
* if inside, < 0 otherwise. The parametric coordinates are
|
||
|
|
* provided in pcoords[3]. The interpolation weights are returned in
|
||
|
|
* weights[]. (The number of weights is equal to the number of
|
||
|
|
* points in the found cell). Tolerance is used to control how close
|
||
|
|
* the point is to be considered "in" the cell.
|
||
|
|
* NB: There is actually no need for a starting cell, just use the
|
||
|
|
* point, as the tree structure is efficient enough.
|
||
|
|
* THIS METHOD IS NOT THREAD SAFE.
|
||
|
|
*/
|
||
|
|
vtkIdType FindCell( double x[3], vtkCell *cell, vtkIdType cellId,
|
||
|
|
double tol2, int& subId, double pcoords[3],
|
||
|
|
double *weights ) VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* This is a version of the above method that can be used with
|
||
|
|
* multithreaded applications. A vtkGenericCell must be passed in
|
||
|
|
* to be used in internal calls that might be made to GetCell()
|
||
|
|
* THIS METHOD IS THREAD SAFE IF FIRST CALLED FROM A SINGLE THREAD AND
|
||
|
|
* THE DATASET IS NOT MODIFIED
|
||
|
|
*/
|
||
|
|
vtkIdType FindCell( double x[3], vtkCell *cell,
|
||
|
|
vtkGenericCell *gencell, vtkIdType cellId,
|
||
|
|
double tol2, int& subId, double pcoords[3],
|
||
|
|
double *weights ) VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Restore data object to initial state,
|
||
|
|
* THIS METHOD IS NOT THREAD SAFE.
|
||
|
|
*/
|
||
|
|
void Initialize() VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Initialize an iterator to browse level 0 trees.
|
||
|
|
*/
|
||
|
|
void InitializeTreeIterator( vtkHyperTreeIterator& );
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Convenience method returns largest cell size in dataset. This is generally
|
||
|
|
* used to allocate memory for supporting data structures.
|
||
|
|
* This is the number of points of a cell.
|
||
|
|
* THIS METHOD IS THREAD SAFE
|
||
|
|
*/
|
||
|
|
int GetMaxCellSize() VTK_OVERRIDE;
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Shallow and Deep copy.
|
||
|
|
*/
|
||
|
|
void ShallowCopy( vtkDataObject* ) VTK_OVERRIDE;
|
||
|
|
void DeepCopy( vtkDataObject* ) VTK_OVERRIDE;
|
||
|
|
//@}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Structured extent. The extent type is a 3D extent
|
||
|
|
*/
|
||
|
|
int GetExtentType() VTK_OVERRIDE { return VTK_3D_EXTENT; }
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Return the actual size of the data in kibibytes (1024 bytes). This number
|
||
|
|
* is valid only after the pipeline has updated. The memory size
|
||
|
|
* returned is guaranteed to be greater than or equal to the
|
||
|
|
* memory required to represent the data (e.g., extra space in
|
||
|
|
* arrays, etc. are not included in the return value). THIS METHOD
|
||
|
|
* IS THREAD SAFE.
|
||
|
|
*/
|
||
|
|
unsigned long GetActualMemorySize() VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Generate the table before calling InitializeSuperCursorChild.
|
||
|
|
*/
|
||
|
|
void GenerateSuperCursorTraversalTable();
|
||
|
|
|
||
|
|
#ifndef __VTK_WRAP__
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* Initialize a super cursor to point to one of the root trees
|
||
|
|
* in the grid. The super cursor points to a node in a tree and
|
||
|
|
* also keeps pointers to the 26 neighbors of said node.
|
||
|
|
*/
|
||
|
|
void InitializeSuperCursor( vtkHyperTreeGridSuperCursor*,
|
||
|
|
unsigned int,
|
||
|
|
unsigned int,
|
||
|
|
unsigned int,
|
||
|
|
vtkIdType );
|
||
|
|
void InitializeSuperCursor( vtkHyperTreeGridSuperCursor*,
|
||
|
|
vtkIdType );
|
||
|
|
//@}
|
||
|
|
/**
|
||
|
|
* Initialize a cursor to point to a child of an existing super cursor.
|
||
|
|
* This will not work in place.
|
||
|
|
*/
|
||
|
|
void InitializeSuperCursorChild( vtkHyperTreeGridSuperCursor* parent,
|
||
|
|
vtkHyperTreeGridSuperCursor* child,
|
||
|
|
unsigned int childIdx );
|
||
|
|
#endif
|
||
|
|
|
||
|
|
//@{
|
||
|
|
/**
|
||
|
|
* The number of children each node can have.
|
||
|
|
*/
|
||
|
|
vtkGetMacro(NumberOfChildren, unsigned int);
|
||
|
|
//@}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Convert a level 0 index to its ijk coordinates according the grid size.
|
||
|
|
*/
|
||
|
|
void GetLevelZeroCoordsFromIndex( vtkIdType index,
|
||
|
|
unsigned int &i,
|
||
|
|
unsigned int &j,
|
||
|
|
unsigned int &k );
|
||
|
|
|
||
|
|
protected:
|
||
|
|
// Constructor with default bounds (0,1, 0,1, 0,1).
|
||
|
|
vtkHyperTreeGrid();
|
||
|
|
~vtkHyperTreeGrid() VTK_OVERRIDE;
|
||
|
|
|
||
|
|
void ComputeBounds() VTK_OVERRIDE;
|
||
|
|
|
||
|
|
void GetCell( vtkIdType, vtkCell* );
|
||
|
|
|
||
|
|
void ComputeDualGrid();
|
||
|
|
vtkPoints* GetPoints();
|
||
|
|
vtkIdTypeArray* GetConnectivity();
|
||
|
|
|
||
|
|
unsigned int Dimension; // 1, 2 or 3.
|
||
|
|
unsigned int GridSize[3];
|
||
|
|
int Extent[6];
|
||
|
|
unsigned int BranchFactor;
|
||
|
|
unsigned int NumberOfChildren;
|
||
|
|
bool TransposedRootIndexing;
|
||
|
|
|
||
|
|
vtkBitArray* MaterialMask;
|
||
|
|
vtkIdTypeArray* MaterialMaskIndex;
|
||
|
|
|
||
|
|
vtkDataArray* XCoordinates;
|
||
|
|
vtkDataArray* YCoordinates;
|
||
|
|
vtkDataArray* ZCoordinates;
|
||
|
|
|
||
|
|
std::map<vtkIdType, vtkHyperTree*> HyperTrees;
|
||
|
|
|
||
|
|
vtkPoints* Points;
|
||
|
|
vtkIdTypeArray* Connectivity;
|
||
|
|
std::map<vtkIdType, bool> PointShifted;
|
||
|
|
std::map<vtkIdType, double> PointShifts[3];
|
||
|
|
std::map<vtkIdType, double> ReductionFactors;
|
||
|
|
|
||
|
|
void DeleteInternalArrays();
|
||
|
|
void DeleteTrees();
|
||
|
|
|
||
|
|
#if !defined(__VTK_WRAP__) && !defined(__WRAP_GCCXML__)
|
||
|
|
void TraverseDualRecursively( vtkHyperTreeGridSuperCursor*, unsigned int );
|
||
|
|
|
||
|
|
void TraverseDualMaskedLeaf( vtkHyperTreeGridSuperCursor* );
|
||
|
|
|
||
|
|
void TraverseDualLeaf( vtkHyperTreeGridSuperCursor* );
|
||
|
|
|
||
|
|
void EvaluateDualCorner( vtkHyperTreeSimpleCursor* );
|
||
|
|
#endif
|
||
|
|
|
||
|
|
// Used to advance the super cursor; One Entry per cursor node.
|
||
|
|
// Private.
|
||
|
|
struct vtkSuperCursorEntry
|
||
|
|
{
|
||
|
|
// For the new node, start with the node in super cursor as parent.
|
||
|
|
unsigned char Parent;
|
||
|
|
// Traverse to this child.
|
||
|
|
unsigned char Child;
|
||
|
|
};
|
||
|
|
|
||
|
|
// Generalizing for 27 tree. Cannot use 3 bits to encode the child to move to.
|
||
|
|
// Input: root in supercursor(3x3x3=27), child(3x3x3=27)
|
||
|
|
// Output: root, child
|
||
|
|
// It is easier to abstract dimensions when we use a single array.
|
||
|
|
vtkSuperCursorEntry SuperCursorTraversalTable[27*27];
|
||
|
|
|
||
|
|
// for the GetCell method
|
||
|
|
vtkLine* Line;
|
||
|
|
vtkPixel* Pixel;
|
||
|
|
vtkVoxel* Voxel;
|
||
|
|
|
||
|
|
// I would like to get rid of this.
|
||
|
|
// Is it a part of the vtkDataSet API?
|
||
|
|
vtkCellLinks* Links;
|
||
|
|
void BuildLinks();
|
||
|
|
|
||
|
|
vtkIdType RecursiveFindPoint( double x[3],
|
||
|
|
vtkHyperTreeSimpleCursor* cursor,
|
||
|
|
double* origin, double* size);
|
||
|
|
|
||
|
|
public:
|
||
|
|
|
||
|
|
// A simplified hyper tree cursor, to be used by the hyper tree
|
||
|
|
// grid supercursor.
|
||
|
|
class VTKCOMMONDATAMODEL_EXPORT vtkHyperTreeSimpleCursor
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
vtkHyperTreeSimpleCursor();
|
||
|
|
|
||
|
|
void Clear();
|
||
|
|
void Initialize( vtkHyperTreeGrid*, vtkIdType, int[3] );
|
||
|
|
void ToRoot();
|
||
|
|
void ToChild( int );
|
||
|
|
bool IsLeaf();
|
||
|
|
vtkHyperTree* GetTree() { return this->Tree; }
|
||
|
|
vtkIdType GetLeafIndex() { return this->Index; } // Only valid for leaves.
|
||
|
|
vtkIdType GetGlobalNodeIndex();
|
||
|
|
unsigned short GetLevel() { return this->Level; }
|
||
|
|
|
||
|
|
private:
|
||
|
|
vtkHyperTree* Tree;
|
||
|
|
vtkIdType Index;
|
||
|
|
unsigned short Level;
|
||
|
|
bool Leaf;
|
||
|
|
};
|
||
|
|
|
||
|
|
class VTKCOMMONDATAMODEL_EXPORT vtkHyperTreeIterator
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
vtkHyperTreeIterator() {}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Initialize the iterator on the tree set of the given HyperTreeGrid.
|
||
|
|
*/
|
||
|
|
void Initialize( vtkHyperTreeGrid* );
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the next tree and set its index then increment the iterator.
|
||
|
|
* Returns 0 at the end.
|
||
|
|
*/
|
||
|
|
vtkHyperTree* GetNextTree( vtkIdType &index );
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the next tree and set its index then increment the iterator.
|
||
|
|
* Returns 0 at the end.
|
||
|
|
*/
|
||
|
|
vtkHyperTree* GetNextTree();
|
||
|
|
|
||
|
|
protected:
|
||
|
|
std::map<vtkIdType, vtkHyperTree*>::iterator Iterator;
|
||
|
|
vtkHyperTreeGrid* Tree;
|
||
|
|
};
|
||
|
|
|
||
|
|
// Public structure filters use to move around the tree.
|
||
|
|
// The super cursor keeps neighbor cells so filters can
|
||
|
|
// easily access neighbor to leaves.
|
||
|
|
// The super cursor is 'const'. Methods in vtkHyperTreeGrid
|
||
|
|
// initialize and compute children for moving toward leaves.
|
||
|
|
struct vtkHyperTreeGridSuperCursor
|
||
|
|
{
|
||
|
|
double Origin[3];
|
||
|
|
double Size[3];
|
||
|
|
int NumberOfCursors;
|
||
|
|
int MiddleCursorId;
|
||
|
|
vtkHyperTreeSimpleCursor Cursors[3*3*3];
|
||
|
|
|
||
|
|
vtkHyperTreeSimpleCursor* GetCursor( int idx )
|
||
|
|
{
|
||
|
|
return this->Cursors + this->MiddleCursorId + idx;
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
private:
|
||
|
|
vtkHyperTreeGrid(const vtkHyperTreeGrid&) VTK_DELETE_FUNCTION;
|
||
|
|
void operator=(const vtkHyperTreeGrid&) VTK_DELETE_FUNCTION;
|
||
|
|
};
|
||
|
|
|
||
|
|
#endif
|