X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Octree.hxx;h=79a641dd4c262b003d8063cf961b20dd924e2afd;hb=56bab2329cbff6ecbfc557e4f547710261c08c73;hp=525bc62ad8b07c4e2daf11c77c8fb33b5d8c1f24;hpb=79b1ac2b6df9117f16f11d444b1f165d477a1813;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_Octree.hxx b/src/SMESH/SMESH_Octree.hxx index 525bc62ad..79a641dd4 100644 --- a/src/SMESH/SMESH_Octree.hxx +++ b/src/SMESH/SMESH_Octree.hxx @@ -1,6 +1,6 @@ -// SMESH SMESH_Octree : global Octree implementation +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // // This library is free software; you can redistribute it and/or @@ -17,14 +17,14 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// +// 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_ @@ -34,67 +34,90 @@ 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 + */ +//================================================================================ + +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