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
|
#ifndef VTKSMPMINMAXTREE_H
#define VTKSMPMINMAXTREE_H
#include "vtkSimpleScalarTree.h"
#include "vtkDataSet.h"
class vtkGenericCell;
class vtkScalarNode {};
template <class TScalar>
class vtkScalarRange : public vtkScalarNode
{
public:
TScalar min;
TScalar max;
};
class VTK_EXPORT vtkSMPMinMaxTree : public vtkSimpleScalarTree
{
vtkSMPMinMaxTree( const vtkSMPMinMaxTree& );
void operator =( const vtkSMPMinMaxTree& );
protected:
vtkSMPMinMaxTree();
~vtkSMPMinMaxTree();
vtkIdType CutOff;
public:
vtkTypeMacro(vtkSMPMinMaxTree, vtkSimpleScalarTree);
static vtkSMPMinMaxTree* New();
void PrintSelf(ostream &os, vtkIndent indent);
void BuildTree();
void InitTraversal(double scalarValue);
template<typename Functor>
int TraverseNode( vtkIdType id, int lvl, Functor& function ) const
{
if ( id >= this->TreeSize )
{
return 0;
}
vtkScalarRange<double> *t = static_cast<vtkScalarRange<double>*>(this->Tree) + id;
if ( t->min > this->ScalarValue || t->max < this->ScalarValue )
{
return 0;
}
if ( lvl <= this->Level - this->CutOff ) //leaf
{
vtkIdType cell_id = ( id - this->LeafOffset ) * this->BranchingFactor;
vtkIdType max_id = this->DataSet->GetNumberOfCells();
vtkIdType end_id = cell_id + this->BranchingFactor;
function(cell_id, end_id > max_id ? max_id : end_id);
return 0;
}
else //node
{
return 1;
}
}
virtual void GetTreeSize ( int& max_level, vtkIdType& branching_factor ) const;
};
#endif // VTKSMPMINMAXTREE_H
|