Salome HOME
untabify
[modules/smesh.git] / src / SMESH / SMESH_Octree.hxx
index 1d40b39e630984cf72b1af67853f006b5f2f7336..79a641dd4c262b003d8063cf961b20dd924e2afd 100644 (file)
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 //  SMESH SMESH_Octree : global Octree implementation
-// File      : SMESH_Octree.hxx
-// Created   : Tue Jan 16 16:00:00 2007
-// Author    : Nicolas Geimer & AurĂ©lien Motteux (OCC)
-// Module    : SMESH
 //
+//  File      : SMESH_Octree.hxx
+//  Created   : Tue Jan 16 16:00:00 2007
+//  Author    : Nicolas Geimer & AurĂ©lien Motteux (OCC)
+//  Module    : SMESH
+
 #ifndef _SMESH_OCTREE_HXX_
 #define _SMESH_OCTREE_HXX_
 
 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;
 
-  // Compute the Octree
-  void                   Compute();
+  // Data limiting the tree height
+  struct Limit {
+    // MaxLevel of the Octree
+    int    myMaxLevel;
+    // Minimal size of the Box
+    double myMinBoxSize;
 
-  // Set the maximal level of the Octree
-  void                   setMaxLevel(const int maxLevel);
+    // 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 minimal size of the Box
-  void                   setMinBoxSize(const double minBoxSize){myMinBoxSize = minBoxSize;};
+  // Constructor. limit must be provided at tree root construction.
+  // limit will be deleted by SMESH_Octree
+  SMESH_Octree (Limit* limit=0);
 
-  // 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
+ */
+//================================================================================
+
+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;
+}
 
-  // Tell us if the Octree is a leaf or not (-1 if not initialized)
-  int            myIsLeaf;
-};
 #endif