#include <vtkHyperOctree.h>
An hyperoctree is a dataset where each node has either exactly 2^n children or no child at all if the node is a leaf. `n' is the dimension of the dataset (1 (binary tree), 2 (quadtree) or 3 (octree) ). The class name comes from the following paper:
@ARTICLE{yau-srihari-1983, author={Mann-May Yau and Sargur N. Srihari}, title={A Hierarchical Data Structure for Multidimensional Digital Images}, journal={Communications of the ACM}, month={July}, year={1983}, volume={26}, number={7}, pages={504--515} }
Each node is a cell. Attributes are associated with cells, not with points. The geometry is implicitly given by the size of the root node on each axis and position of the center and the orientation. (TODO: review center position and orientation). The geometry is then not limited to an hybercube but can have a rectangular shape. Attributes are associated with leaves. For LOD (Level-Of-Detail) purpose, attributes can be computed on none-leaf nodes by computing the average values from its children (which can be leaves or not).
By construction, an hyperoctree is efficient in memory usage when the geometry is sparse. The LOD feature allows to cull quickly part of the dataset.
A couple of filters can be applied on this dataset: contour, outline, geometry.
3D case (octree) for each node, each child index (from 0 to 7) is encoded in the following orientation. It is easy to access each child as a cell of a grid. Note also that the binary representation is relevant, each bit code a side: bit 0 encodes -x side (0) or +x side (1) bit 1 encodes -y side (0) or +y side (1) bit 2 encodes -z side (0) or +z side (2)
+y +-+-+ ^ |2|3| | +-+-+ O +z +-> +x |0|1| +-+-+
+y +-+-+ ^ |6|7| | +-+-+ O +z +-> +x |4|5| +-+-+
The cases with fewer dimensions are consistent with the octree case:
Quadtree: in counter-clockwise
+y +-+-+ ^ |2|3| | +-+-+ O+-> +x |0|1| +-+-+
Binary tree:
+0+1+ O+-> +x
Definition at line 141 of file vtkHyperOctree.h.
typedef vtkDataSet vtkHyperOctree::Superclass |
vtkHyperOctree::vtkHyperOctree | ( | ) | [protected] |
vtkHyperOctree::~vtkHyperOctree | ( | ) | [protected] |
static vtkInformationIntegerKey* vtkHyperOctree::LEVELS | ( | ) | [static] |
static vtkInformationIntegerKey* vtkHyperOctree::DIMENSION | ( | ) | [static] |
static vtkInformationDoubleVectorKey* vtkHyperOctree::SIZES | ( | ) | [static] |
static vtkHyperOctree* vtkHyperOctree::New | ( | ) | [static] |
Create an object with Debug turned off, modified time initialized to zero, and reference counting on.
Reimplemented from vtkDataObject.
virtual const char* vtkHyperOctree::GetClassName | ( | ) | [virtual] |
Reimplemented from vtkDataSet.
static int vtkHyperOctree::IsTypeOf | ( | const char * | name | ) | [static] |
Return 1 if this class type is the same type of (or a subclass of) the named class. Returns 0 otherwise. This method works in combination with vtkTypeMacro found in vtkSetGet.h.
Reimplemented from vtkDataSet.
virtual int vtkHyperOctree::IsA | ( | const char * | name | ) | [virtual] |
Return 1 if this class is the same type of (or a subclass of) the named class. Returns 0 otherwise. This method works in combination with vtkTypeMacro found in vtkSetGet.h.
Reimplemented from vtkDataSet.
static vtkHyperOctree* vtkHyperOctree::SafeDownCast | ( | vtkObject * | o | ) | [static] |
Reimplemented from vtkDataSet.
void vtkHyperOctree::PrintSelf | ( | ostream & | os, | |
vtkIndent | indent | |||
) | [virtual] |
Methods invoked by print to print information about the object including superclasses. Typically not called by the user (use Print() instead) but used in the hierarchical print process to combine the output of several classes.
Reimplemented from vtkDataSet.
int vtkHyperOctree::GetDataObjectType | ( | ) | [virtual] |
Return what type of dataset this is.
Reimplemented from vtkDataSet.
void vtkHyperOctree::CopyStructure | ( | vtkDataSet * | ds | ) | [virtual] |
Copy the geometric and topological structure of an input rectilinear grid object.
Implements vtkDataSet.
int vtkHyperOctree::GetDimension | ( | ) |
Return the dimension of the tree (1D:binary tree(2 children), 2D:quadtree(4 children), 3D:octree (8 children))
void vtkHyperOctree::SetDimension | ( | int | dim | ) |
Set the dimension of the tree with `dim'. See GetDimension() for details.
vtkIdType vtkHyperOctree::GetNumberOfCells | ( | ) | [virtual] |
Return the number of cells in the dual grid.
Implements vtkDataSet.
vtkIdType vtkHyperOctree::GetNumberOfLeaves | ( | ) |
Get the number of leaves in the tree.
vtkIdType vtkHyperOctree::GetNumberOfPoints | ( | ) | [virtual] |
Return the number of points in the dual grid.
Implements vtkDataSet.
vtkIdType vtkHyperOctree::GetMaxNumberOfPoints | ( | int | level | ) |
Return the number of points corresponding to an hyperoctree starting at level `level' where all the leaves at at the last level. In this case, the hyperoctree is like a uniform grid. So this number is the number of points of the uniform grid.
vtkIdType vtkHyperOctree::GetMaxNumberOfPointsOnBoundary | ( | int | level | ) |
Return the number of points corresponding to the boundary of an hyperoctree starting at level `level' where all the leaves at at the last level. In this case, the hyperoctree is like a uniform grid. So this number is the number of points of on the boundary of the uniform grid. For an octree, the boundary are the faces. For a quadtree, the boundary are the edges.
positive_level: level>=0 && level<this->GetNumberOfLevels()
max_result: result<=GetMaxNumberOfPoints(level)
vtkIdType vtkHyperOctree::GetMaxNumberOfCellsOnBoundary | ( | int | level | ) |
Return the number of cells corresponding to the boundary of a cell of level `level' where all the leaves at at the last level.
vtkIdType vtkHyperOctree::GetNumberOfLevels | ( | ) |
Return the number of levels.
virtual void vtkHyperOctree::SetSize | ( | double | , | |
double | , | |||
double | ||||
) | [virtual] |
Set the size on each axis.
virtual void vtkHyperOctree::SetSize | ( | double | [3] | ) | [virtual] |
Set the size on each axis.
virtual double* vtkHyperOctree::GetSize | ( | ) | [virtual] |
Return the size on each axis.
virtual void vtkHyperOctree::GetSize | ( | double & | , | |
double & | , | |||
double & | ||||
) | [virtual] |
Return the size on each axis.
virtual void vtkHyperOctree::GetSize | ( | double | [3] | ) | [virtual] |
Return the size on each axis.
virtual void vtkHyperOctree::SetOrigin | ( | double | , | |
double | , | |||
double | ||||
) | [virtual] |
Set the origin (position of corner (0,0,0) of the root.
virtual void vtkHyperOctree::SetOrigin | ( | double | [3] | ) | [virtual] |
Set the origin (position of corner (0,0,0) of the root.
virtual double* vtkHyperOctree::GetOrigin | ( | ) | [virtual] |
Set the origin (position of corner (0,0,0) of the root.
virtual void vtkHyperOctree::GetOrigin | ( | double & | , | |
double & | , | |||
double & | ||||
) | [virtual] |
Set the origin (position of corner (0,0,0) of the root.
virtual void vtkHyperOctree::GetOrigin | ( | double | [3] | ) | [virtual] |
Set the origin (position of corner (0,0,0) of the root.
vtkHyperOctreeCursor* vtkHyperOctree::NewCellCursor | ( | ) |
Create a new cursor: an object that can traverse the cell of an hyperoctree.
void vtkHyperOctree::SubdivideLeaf | ( | vtkHyperOctreeCursor * | leaf | ) |
Subdivide node pointed by cursor, only if its a leaf. At the end, cursor points on the node that used to be leaf.
is_a_leaf: leaf->CurrentIsLeaf()
void vtkHyperOctree::CollapseTerminalNode | ( | vtkHyperOctreeCursor * | node | ) |
Collapse a node for which all children are leaves. At the end, cursor points on the leaf that used to be a node.
node_is_node: !node->CurrentIsLeaf()
children_are_leaves: node->CurrentIsTerminalNode()
virtual double* vtkHyperOctree::GetPoint | ( | vtkIdType | ptId | ) | [virtual] |
Get point coordinates with ptId such that: 0 <= ptId < NumberOfPoints. THIS METHOD IS NOT THREAD SAFE.
Implements vtkDataSet.
virtual void vtkHyperOctree::GetPoint | ( | vtkIdType | id, | |
double | x[3] | |||
) | [virtual] |
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
Reimplemented from vtkDataSet.
Get cell with cellId such that: 0 <= cellId < NumberOfCells. THIS METHOD IS NOT THREAD SAFE.
Implements vtkDataSet.
virtual void vtkHyperOctree::GetCell | ( | vtkIdType | cellId, | |
vtkGenericCell * | cell | |||
) | [virtual] |
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
Implements vtkDataSet.
virtual int vtkHyperOctree::GetCellType | ( | vtkIdType | cellId | ) | [virtual] |
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
Implements vtkDataSet.
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
Implements vtkDataSet.
virtual void vtkHyperOctree::GetCellPoints | ( | vtkIdType | cellId, | |
vtkIdType & | npts, | |||
vtkIdType *& | pts | |||
) | [virtual] |
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
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
Implements vtkDataSet.
virtual void vtkHyperOctree::GetCellNeighbors | ( | vtkIdType | cellId, | |
vtkIdList * | ptIds, | |||
vtkIdList * | cellIds | |||
) | [virtual] |
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 METHOD IS THREAD SAFE IF FIRST CALLED FROM A SINGLE THREAD AND THE DATASET IS NOT MODIFIED
Reimplemented from vtkDataSet.
virtual vtkIdType vtkHyperOctree::FindPoint | ( | double | x[3] | ) | [virtual] |
Locate the closest point to the global coordinate x. Return the point id. If point id < 0; then no point found. (This may arise when point is outside of dataset.) THIS METHOD IS THREAD SAFE IF FIRST CALLED FROM A SINGLE THREAD AND THE DATASET IS NOT MODIFIED
Implements vtkDataSet.
virtual vtkIdType vtkHyperOctree::FindCell | ( | double | x[3], | |
vtkCell * | cell, | |||
vtkIdType | cellId, | |||
double | tol2, | |||
int & | subId, | |||
double | pcoords[3], | |||
double * | weights | |||
) | [virtual] |
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. THIS METHOD IS NOT THREAD SAFE.
Implements vtkDataSet.
virtual vtkIdType vtkHyperOctree::FindCell | ( | double | x[3], | |
vtkCell * | cell, | |||
vtkGenericCell * | gencell, | |||
vtkIdType | cellId, | |||
double | tol2, | |||
int & | subId, | |||
double | pcoords[3], | |||
double * | weights | |||
) | [virtual] |
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
Implements vtkDataSet.
void vtkHyperOctree::Initialize | ( | ) | [virtual] |
Restore data object to initial state, THIS METHOD IS NOT THREAD SAFE.
Reimplemented from vtkDataSet.
virtual int vtkHyperOctree::GetMaxCellSize | ( | ) | [virtual] |
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
Implements vtkDataSet.
void vtkHyperOctree::ShallowCopy | ( | vtkDataObject * | src | ) | [virtual] |
Shallow and Deep copy.
Reimplemented from vtkDataSet.
void vtkHyperOctree::DeepCopy | ( | vtkDataObject * | src | ) | [virtual] |
Shallow and Deep copy.
Reimplemented from vtkDataSet.
void vtkHyperOctree::GetPointsOnFace | ( | vtkHyperOctreeCursor * | sibling, | |
int | face, | |||
int | level, | |||
vtkHyperOctreePointsGrabber * | grabber | |||
) |
Get the points of node `sibling' on its face `face'.
sibling_not_leaf: !sibling->CurrentIsLeaf()
sibling_3d: sibling->GetDimension()==3
valid_face: face>=0 && face<6
valid_level_not_leaf: level>=0 level<(this->GetNumberOfLevels()-1)
void vtkHyperOctree::GetPointsOnParentFaces | ( | int | faces[3], | |
int | level, | |||
vtkHyperOctreeCursor * | cursor, | |||
vtkHyperOctreePointsGrabber * | grabber | |||
) |
Get the points of the parent node of `cursor' on its faces `faces' at level `level' or deeper.
cursor_3d: cursor->GetDimension()==3
valid_level: level>=0
boolean_faces: (faces[0]==0 || faces[0]==1) && (faces[1]==0 || faces[1]==1) && (faces[2]==0 || faces[2]==1)
void vtkHyperOctree::GetPointsOnEdge | ( | vtkHyperOctreeCursor * | sibling, | |
int | level, | |||
int | axis, | |||
int | k, | |||
int | j, | |||
vtkHyperOctreePointsGrabber * | grabber | |||
) |
Get the points of node `sibling' on its edge `axis','k','j'. If axis==0, the edge is X-aligned and k gives the z coordinate and j the y-coordinate. If axis==1, the edge is Y-aligned and k gives the x coordinate and j the z coordinate. If axis==2, the edge is Z-aligned and k gives the y coordinate and j the x coordinate.
sibling_3d: sibling->GetDimension()==3
sibling_not_leaf: !sibling->CurrentIsLeaf()
valid_axis: axis>=0 && axis<3
valid_k: k>=0 && k<=1
valid_j: j>=0 && j<=1
valid_level_not_leaf: level>=0 level<(this->Input->GetNumberOfLevels()-1)
void vtkHyperOctree::GetPointsOnParentEdge | ( | vtkHyperOctreeCursor * | cursor, | |
int | level, | |||
int | axis, | |||
int | k, | |||
int | j, | |||
vtkHyperOctreePointsGrabber * | grabber | |||
) |
Get the points of the parent node of `cursor' on its edge `axis','k','j' at level `level' or deeper. If axis==0, the edge is X-aligned and k gives the z coordinate and j the y-coordinate. If axis==1, the edge is Y-aligned and k gives the x coordinate and j the z coordinate. If axis==2, the edge is Z-aligned and k gives the y coordinate and j the x coordinate.
cursor_3d: cursor->GetDimension()==3
valid_level: level>=0
valid_range_axis: axis>=0 && axis<3
valid_range_k: k>=0 && k<=1
valid_range_j: j>=0 && j<=1
void vtkHyperOctree::GetPointsOnEdge2D | ( | vtkHyperOctreeCursor * | sibling, | |
int | edge, | |||
int | level, | |||
vtkHyperOctreePointsGrabber * | grabber | |||
) |
Get the points of node `sibling' on its edge `edge'.
sibling_not_leaf: !sibling->CurrentIsLeaf()
sibling_2d: sibling->GetDimension()==2
valid_edge: edge>=0 && edge<4
valid_level_not_leaf: level>=0 level<(this->Input->GetNumberOfLevels()-1)
void vtkHyperOctree::GetPointsOnParentEdge2D | ( | vtkHyperOctreeCursor * | cursor, | |
int | edge, | |||
int | level, | |||
vtkHyperOctreePointsGrabber * | grabber | |||
) |
Get the points of the parent node of `cursor' on its edge `edge' at level `level' or deeper. (edge=0 for -X, 1 for +X, 2 for -Y, 3 for +Y)
cursor_2d: cursor->GetDimension()==2
valid_level: level>=0
valid_edge: edge>=0 && edge<4
vtkDataSetAttributes* vtkHyperOctree::GetLeafData | ( | ) |
A generic way to set the leaf data attributes. This can be either point data for dual or cell data for normal grid.
void vtkHyperOctree::SetDualGridFlag | ( | int | flag | ) |
Switch between returning leaves as cells, or the dual grid.
virtual int vtkHyperOctree::GetDualGridFlag | ( | ) | [virtual] |
Switch between returning leaves as cells, or the dual grid.
unsigned long vtkHyperOctree::GetActualMemorySize | ( | ) | [virtual] |
Return the actual size of the data in kilobytes. 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.
Reimplemented from vtkDataSet.
static vtkHyperOctree* vtkHyperOctree::GetData | ( | vtkInformation * | info | ) | [static] |
Retrieve an instance of this class from an information object.
Reimplemented from vtkDataSet.
static vtkHyperOctree* vtkHyperOctree::GetData | ( | vtkInformationVector * | v, | |
int | i = 0 | |||
) | [static] |
Retrieve an instance of this class from an information object.
Reimplemented from vtkDataSet.
void vtkHyperOctree::ComputeBounds | ( | ) | [protected, virtual] |
Compute the data bounding box from data points. THIS METHOD IS NOT THREAD SAFE.
Reimplemented from vtkDataSet.
void vtkHyperOctree::UpdateDualArrays | ( | ) | [protected] |
vtkPoints* vtkHyperOctree::GetLeafCenters | ( | ) | [protected] |
vtkIdTypeArray* vtkHyperOctree::GetCornerLeafIds | ( | ) | [protected] |
void vtkHyperOctree::UpdateGridArrays | ( | ) | [protected] |
vtkPoints* vtkHyperOctree::GetCornerPoints | ( | ) | [protected] |
vtkIdTypeArray* vtkHyperOctree::GetLeafCornerIds | ( | ) | [protected] |
void vtkHyperOctree::DeleteInternalArrays | ( | ) | [protected] |
void vtkHyperOctree::TraverseDualRecursively | ( | vtkHyperOctreeLightWeightCursor * | neighborhood, | |
unsigned short * | xyzIds, | |||
int | level | |||
) | [protected] |
void vtkHyperOctree::TraverseGridRecursively | ( | vtkHyperOctreeLightWeightCursor * | neighborhood, | |
unsigned char * | visited, | |||
double * | origin, | |||
double * | size | |||
) | [protected] |
void vtkHyperOctree::EvaluateDualCorner | ( | vtkHyperOctreeLightWeightCursor * | neighborhood | ) | [protected] |
vtkIdType vtkHyperOctree::EvaluateGridCorner | ( | int | level, | |
vtkHyperOctreeLightWeightCursor * | neighborhood, | |||
unsigned char * | visited, | |||
int * | cornerNeighborIds | |||
) | [protected] |
void vtkHyperOctree::GenerateGridNeighborhoodTraversalTable | ( | ) | [protected] |
void vtkHyperOctree::GenerateDualNeighborhoodTraversalTable | ( | ) | [protected] |
void vtkHyperOctree::BuildLinks | ( | ) | [protected] |
vtkIdType vtkHyperOctree::RecursiveFindPoint | ( | double | x[3], | |
vtkHyperOctreeLightWeightCursor * | cursor, | |||
double * | origin, | |||
double * | size | |||
) | [protected] |
friend class vtkHyperOctreeLightWeightCursor [friend] |
Definition at line 480 of file vtkHyperOctree.h.
int vtkHyperOctree::Dimension [protected] |
Definition at line 470 of file vtkHyperOctree.h.
double vtkHyperOctree::Size[3] [protected] |
Definition at line 472 of file vtkHyperOctree.h.
double vtkHyperOctree::Origin[3] [protected] |
Definition at line 473 of file vtkHyperOctree.h.
vtkHyperOctreeInternal* vtkHyperOctree::CellTree [protected] |
Definition at line 475 of file vtkHyperOctree.h.
vtkHyperOctreeCursor* vtkHyperOctree::TmpChild [protected] |
Definition at line 477 of file vtkHyperOctree.h.
vtkPoints* vtkHyperOctree::LeafCenters [protected] |
Definition at line 487 of file vtkHyperOctree.h.
vtkIdTypeArray* vtkHyperOctree::CornerLeafIds [protected] |
Definition at line 488 of file vtkHyperOctree.h.
vtkPoints* vtkHyperOctree::CornerPoints [protected] |
Definition at line 493 of file vtkHyperOctree.h.
vtkIdTypeArray* vtkHyperOctree::LeafCornerIds [protected] |
Definition at line 494 of file vtkHyperOctree.h.
int vtkHyperOctree::NeighborhoodTraversalTable[216] [protected] |
Definition at line 513 of file vtkHyperOctree.h.
vtkLine* vtkHyperOctree::Line [protected] |
Definition at line 518 of file vtkHyperOctree.h.
vtkPixel* vtkHyperOctree::Pixel [protected] |
Definition at line 519 of file vtkHyperOctree.h.
vtkVoxel* vtkHyperOctree::Voxel [protected] |
Definition at line 520 of file vtkHyperOctree.h.
vtkCellLinks* vtkHyperOctree::Links [protected] |
Definition at line 522 of file vtkHyperOctree.h.
int vtkHyperOctree::DualGridFlag [protected] |
Definition at line 531 of file vtkHyperOctree.h.