class SMESH_Octree {
public:
- // Constructor
- SMESH_Octree (const int maxLevel = -1, const double minBoxSize = 0.);
- // Destructor
- virtual ~SMESH_Octree ();
-
- // Tell if Octree is a leaf or not (has to be implemented in inherited classes)
- virtual const bool isLeaf() = 0;
+ // Data limiting the tree height
+ struct Limit {
+ // MaxLevel of the Octree
+ int myMaxLevel;
+ // Minimal size of the Box
+ double myMinBoxSize;
- // Compute the Octree
- void Compute();
+ // Default:
+ // maxLevel-> 8^8 = 16777216 terminal trees
+ // minSize -> box size not checked
+ Limit(int maxLevel=8, double minSize=0.):myMaxLevel(maxLevel),myMinBoxSize(minSize) {}
+ virtual ~Limit() {} // it can be inherited
+ };
- // Set the maximal level of the Octree
- void setMaxLevel(const int maxLevel);
+ // Constructor. limit must be provided at tree root construction.
+ // limit will be deleted by SMESH_Octree
+ SMESH_Octree (Limit* limit=0);
- // Set the minimal size of the Box
- void setMinBoxSize(const double minBoxSize){myMinBoxSize = minBoxSize;};
-
- // Set the bounding box of the Octree
- void setBox(const Bnd_B3d* box);
+ // Destructor
+ virtual ~SMESH_Octree ();
- // Set box to the 3d Bounding Box of the Octree
- void getBox(Bnd_B3d & box);
+ // Compute the Octree. Must be called by constructor of inheriting class
+ void compute();
- // Compute the bigger dimension of the box
- static double maxSize(const Bnd_B3d* box);
+ // Tell if Octree is a leaf or not.
+ // An inheriting class can influence it via myIsLeaf protected field
+ bool isLeaf() const;
// Return its level
int level() const { return myLevel; }
+ // Get box to the 3d Bounding Box of the Octree
+ const Bnd_B3d& getBox() const { return *myBox; }
+
+ // Compute the bigger dimension of my box
+ double maxSize() const;
+
+ // Return index of a child the given point is in
+ inline int getChildIndex(double x, double y, double z, const gp_XYZ& boxMiddle)const;
+
protected:
- // Constructor for children (has to be implemented in inherited classes)
- virtual SMESH_Octree* allocateOctreeChild() = 0;
+ // Return box of the whole tree
+ virtual Bnd_B3d* buildRootBox() = 0;
- // Build the 8 children boxes
- void buildChildren();
+ // Constructor for children
+ virtual SMESH_Octree* allocateOctreeChild() const = 0;
- // Build the data in the 8 children (has to be implemented in inherited classes)
- virtual void buildChildrenData() = 0;
+ // Build the data in the 8 children
+ virtual void buildChildrenData() = 0;
// members
- // Box of the Octree
- Bnd_B3d* myBox;
-
// Array of 8 Octree children
SMESH_Octree** myChildren;
// Point the father, set to NULL for the level 0
SMESH_Octree* myFather;
+ // Tell us if the Octree is a leaf or not
+ bool myIsLeaf;
+
+ // Tree limit
+ const Limit* myLimit;
+
+private:
+ // Build the 8 children boxes recursively
+ void buildChildren();
+
// Level of the Octree
int myLevel;
- // MaxLevel of the Octree
- int myMaxLevel;
+ Bnd_B3d* myBox;
+};
- // Minimal size of the Box
- double myMinBoxSize;
+//================================================================================
+/*!
+ * \brief Return index of a child the given point is in
+ */
+//================================================================================
- // Tell us if the Octree is a leaf or not (-1 if not initialized)
- int myIsLeaf;
-};
+inline int SMESH_Octree::getChildIndex(double x, double y, double z, const gp_XYZ& mid) const
+{
+ return (x > mid.X()) + ( y > mid.Y())*2 + (z > mid.Z())*4;
+}
#endif