/*========================================================================= Program: Visualization Toolkit Module: vtkBSPCuts.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. =========================================================================*/ /*---------------------------------------------------------------------------- Copyright (c) Sandia Corporation See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details. ----------------------------------------------------------------------------*/ /** * @class vtkBSPCuts * @brief This class represents an axis-aligned Binary Spatial * Partitioning of a 3D space. * * * This class converts between the vtkKdTree * representation of a tree of vtkKdNodes (used by vtkDistributedDataFilter) * and a compact array representation that might be provided by a * graph partitioning library like Zoltan. Such a representation * could be used in message passing. * * @sa * vtkKdTree vtkKdNode vtkDistributedDataFilter */ #ifndef vtkBSPCuts_h #define vtkBSPCuts_h #include "vtkCommonDataModelModule.h" // For export macro #include "vtkDataObject.h" class vtkKdNode; class VTKCOMMONDATAMODEL_EXPORT vtkBSPCuts : public vtkDataObject { public: static vtkBSPCuts* New(); vtkTypeMacro(vtkBSPCuts, vtkDataObject); void PrintSelf(ostream& os, vtkIndent indent) override; /** * Initialize the cuts with arrays of information. This type of * information would be obtained from a graph partitioning software * package like Zoltan. * bounds - the bounds (xmin, xmax, ymin, ymax, zmin, zmax) of the * space being partitioned * ncuts - the number cuts, also the size of the following arrays * dim - the dimension along which the cut is made (x/y/z - 0/1/2) * coord - the location of the cut along the axis * lower - array index for the lower region bounded by the cut * upper - array index for the upper region bounded by the cut * lowerDataCoord - optional upper bound of the data in the lower region * upperDataCoord - optional lower bound of the data in the upper region * npoints - optional number of points in the spatial region */ void CreateCuts(double* bounds, int ncuts, int* dim, double* coord, int* lower, int* upper, double* lowerDataCoord, double* upperDataCoord, int* npoints); /** * Initialize the cuts from a tree of vtkKdNode's */ void CreateCuts(vtkKdNode* kd); /** * Return a tree of vtkKdNode's representing the cuts specified * in this object. This is our copy, don't delete it. */ vtkKdNode* GetKdNodeTree() { return this->Top; } /** * Get the number of cuts in the partitioning, which also the size of * the arrays in the array representation of the partitioning. */ vtkGetMacro(NumberOfCuts, int); /** * Get the arrays representing the cuts in the partitioning. */ int GetArrays(int len, int* dim, double* coord, int* lower, int* upper, double* lowerDataCoord, double* upperDataCoord, int* npoints); /** * Compare these cuts with those of the other tree. Returns true if * the two trees are the same. */ int Equals(vtkBSPCuts* other, double tolerance = 0.0); void PrintTree(); void PrintArrays(); //@{ /** * Retrieve an instance of this class from an information object. */ static vtkBSPCuts* GetData(vtkInformation* info); static vtkBSPCuts* GetData(vtkInformationVector* v, int i = 0); //@} /** * Restore data object to initial state, */ void Initialize() override; //@{ /** * Shallow copy. These copy the data, but not any of the * pipeline connections. */ void ShallowCopy(vtkDataObject* src) override; void DeepCopy(vtkDataObject* src) override; //@} protected: vtkBSPCuts(); ~vtkBSPCuts() override; static void DeleteAllDescendants(vtkKdNode* kd); static int CountNodes(vtkKdNode* kd); static void SetMinMaxId(vtkKdNode* kd); static void _PrintTree(vtkKdNode* kd, int depth); void BuildTree(vtkKdNode* kd, int idx); int WriteArray(vtkKdNode* kd, int loc); void ResetArrays(); void AllocateArrays(int size); vtkKdNode* Top; // required cut information int NumberOfCuts; // number of cuts, also length of each array int* Dim; // dimension (x/y/z - 0/1/2) where cut occurs double* Coord; // location of cut along axis int* Lower; // location in arrays of left (lower) child info int* Upper; // location in arrays of right (lower) child info // optional cut information double* LowerDataCoord; // coordinate of uppermost data in lower half double* UpperDataCoord; // coordinate of lowermost data in upper half int* Npoints; // number of data values in partition double Bounds[6]; vtkBSPCuts(const vtkBSPCuts&) = delete; void operator=(const vtkBSPCuts&) = delete; }; #endif