/*========================================================================= Program: Visualization Toolkit Module: vtkHyperOctreeCursor.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 vtkHyperOctreeCursor * @brief Objects that can traverse hyperoctree nodes. * * Objects that can traverse hyperoctree nodes. It is an abstract class. * Cursors are created by the hyperoctree. * @sa * vtkDataObject vtkFieldData vtkHyperOctreeAlgorithm */ #ifndef vtkHyperOctreeCursor_h #define vtkHyperOctreeCursor_h #include "vtkCommonDataModelModule.h" // For export macro #include "vtkObject.h" #if !defined(VTK_LEGACY_REMOVE) enum { VTK_OCTREE_CHILD_ZMIN_YMIN_XMIN=0, VTK_OCTREE_CHILD_ZMIN_YMIN_XMAX, VTK_OCTREE_CHILD_ZMIN_YMAX_XMIN, VTK_OCTREE_CHILD_ZMIN_YMAX_XMAX, VTK_OCTREE_CHILD_ZMAX_YMIN_XMIN, VTK_OCTREE_CHILD_ZMAX_YMIN_XMAX, VTK_OCTREE_CHILD_ZMAX_YMAX_XMIN, VTK_OCTREE_CHILD_ZMAX_YMAX_XMAX }; const int VTK_QUADTREE_CHILD_SW=VTK_OCTREE_CHILD_ZMIN_YMIN_XMIN; const int VTK_QUADTREE_CHILD_SE=VTK_OCTREE_CHILD_ZMIN_YMIN_XMAX; const int VTK_QUADTREE_CHILD_NW=VTK_OCTREE_CHILD_ZMIN_YMAX_XMIN; const int VTK_QUADTREE_CHILD_NE=VTK_OCTREE_CHILD_ZMIN_YMAX_XMAX; const int VTK_BINARY_TREE_CHILD_LEFT=VTK_QUADTREE_CHILD_SW; const int VTK_BINARY_TREE_CHILD_RIGHT=VTK_QUADTREE_CHILD_SE; class VTKCOMMONDATAMODEL_EXPORT vtkHyperOctreeCursor : public vtkObject { public: vtkTypeMacro(vtkHyperOctreeCursor,vtkObject); void PrintSelf(ostream& os, vtkIndent indent) override; /** * Return the index of the current leaf in the data arrays. * \pre is_leaf: CurrentIsLeaf() */ virtual int GetLeafId()=0; /** * Is the node pointed by the cursor a leaf? */ virtual int CurrentIsLeaf()=0; /** * Is the node pointed by the cursor the root? */ virtual int CurrentIsRoot()=0; /** * Return the level of the node pointed by the cursor. * \post positive_result: result>=0 */ virtual int GetCurrentLevel()=0; /** * Return the child number of the current node relative to its parent. * \pre not_root: !CurrentIsRoot(). * \post valid_range: result>=0 && result=0 && childGetNumberOfChildren() */ virtual void ToChild(int child)=0; /** * Move the cursor to the same node pointed by `other'. * \pre other_exists: other!=0 * \pre same_hyperoctree: this->SameTree(other); * \post equal: this->IsEqual(other) */ virtual void ToSameNode(vtkHyperOctreeCursor *other)=0; /** * Is `this' equal to `other'? * \pre other_exists: other!=0 * \pre same_hyperoctree: this->SameTree(other); */ virtual int IsEqual(vtkHyperOctreeCursor *other)=0; /** * Create a copy of `this'. * \post results_exists:result!=0 * \post same_tree: result->SameTree(this) */ virtual vtkHyperOctreeCursor *Clone()=0; /** * Are `this' and `other' pointing on the same hyperoctree? * \pre other_exists: other!=0 */ virtual int SameTree(vtkHyperOctreeCursor *other)=0; /** * Return the index in dimension `d', as if the node was a cell of a * uniform grid of 1<=0 && d=0 && result<(1<0 */ virtual int GetNumberOfChildren()=0; /** * Return the dimension of the tree. * \post positive_result: result>0 */ virtual int GetDimension()=0; /** * Move to the node described by its indices in each dimension and * at a given level. If there is actually a node or a leaf at this * location, Found() returns true. Otherwise, Found() returns false and the * cursor moves to the closest parent of the query. It can be the root in the * worst case. * \pre indices_exists: indices!=0 * \pre valid_size: sizeof(indices)==GetDimension() * \pre valid_level: level>=0 */ virtual void MoveToNode(int *indices, int level)=0; /** * Did the last call to MoveToNode succeed? */ virtual int Found()=0; protected: // Constructor. vtkHyperOctreeCursor(); ~vtkHyperOctreeCursor() override; private: vtkHyperOctreeCursor(const vtkHyperOctreeCursor&) = delete; void operator=(const vtkHyperOctreeCursor&) = delete; }; #endif // LEGACY remove #endif