X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Octree.cxx;h=00bdb26698cb480a6c7404cf29b5b1c84460a2a6;hb=a44eb772288be535cc8de8125e98edb7330adc1f;hp=5b224ae5d8ff163c56c6b4a097cb6373e3f43bea;hpb=984c4ffdd7df62aeaedc544cd0b8e64ff8f53f1a;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_Octree.cxx b/src/SMESH/SMESH_Octree.cxx index 5b224ae5d..00bdb2669 100644 --- a/src/SMESH/SMESH_Octree.cxx +++ b/src/SMESH/SMESH_Octree.cxx @@ -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,31 +17,50 @@ // 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.cxx -// Created : Tue Jan 16 16:00:00 2007 -// Author : Nicolas Geimer & Aurélien Motteux(OCC) -// Module : SMESH +// File : SMESH_Octree.cxx +// Created : Tue Jan 16 16:00:00 2007 +// Author : Nicolas Geimer & Aurélien Motteux(OCC) +// Module : SMESH #include "SMESH_Octree.hxx" //=========================================================================== /*! - * \brief SMESH_Octree Constructor - * \param maxLevel - The level max the octree can reach (If <0 unlimited) + * Constructor. limit must be provided at tree root construction. + * limit will be deleted by SMESH_Octree. */ //=========================================================================== -SMESH_Octree::SMESH_Octree (const int maxLevel, const double minBoxSize): - myFather(NULL), - myLevel(0), - myMaxLevel(maxLevel), - myMinBoxSize(minBoxSize), - myIsLeaf(-1) + +SMESH_Octree::SMESH_Octree (SMESH_Octree::Limit* limit): + myChildren(NULL), + myFather(NULL), + myIsLeaf( false ), + myLimit( limit ), + myLevel(0), + myBox(NULL) { - myBox = new Bnd_B3d(); +} + +//================================================================================ +/*! + * \brief Compute the Octree + */ +//================================================================================ + +void SMESH_Octree::compute() +{ + if ( myLevel==0 ) + { + myBox = buildRootBox(); + if ( myLimit->myMinBoxSize > 0. && maxSize() <= myLimit->myMinBoxSize ) + myIsLeaf = true; + else + buildChildren(); + } } //====================================== @@ -49,83 +68,25 @@ SMESH_Octree::SMESH_Octree (const int maxLevel, const double minBoxSize): * \brief SMESH_Octree Destructor */ //====================================== + SMESH_Octree::~SMESH_Octree () { if(myChildren != NULL) { - if(!myIsLeaf) + if(!isLeaf()) { for(int i = 0; i<8; i++) delete myChildren[i]; - delete[] myChildren ; + delete[] myChildren; + myChildren = 0; } } - delete myBox; -} - -//=========================================================================== -/*! - * \brief Set the bounding box of the Octree - * \param box - 3d Bounding Box of the Octree - */ -//=========================================================================== -void SMESH_Octree::setBox(const Bnd_B3d* box) -{ - delete myBox; - myBox=new Bnd_B3d(*box); -} - -//=========================================================================== -/*! - * \brief Set box to the 3d Bounding Box of the Octree - * \param box - Set box to the 3d Bounding Box of the Octree - */ -//=========================================================================== -void SMESH_Octree::getBox(Bnd_B3d* box) -{ - if(box != NULL) - delete box; - box = new Bnd_B3d (*myBox); -} - -//=========================================================================== -/*! - * \brief Set the max level of the Octree - * \param maxLevel - The level max the octree can reach (If <0 unlimited) - */ -//=========================================================================== -void SMESH_Octree::setMaxLevel(const int maxLevel) -{myMaxLevel = maxLevel;} - - -//=========================================================================== -/*! - * \brief Compute the bigger dimension of the box - * \param box - 3d Box - * \retval double - bigger dimension of the box - */ -//=========================================================================== -double SMESH_Octree::maxSize(const Bnd_B3d* box) -{ - if(box ==NULL) - return 0; - gp_XYZ min = box->CornerMin(); - gp_XYZ max = box->CornerMax(); - gp_XYZ Size = (max - min); - double returnVal = (Size.X()>Size.Y())?Size.X():Size.Y(); - return (returnVal>Size.Z())?returnVal:Size.Z(); -} - -//============================= -/*! - * \brief Compute the Octree - */ -//============================= -void SMESH_Octree::Compute() -{ - // As soon as the Octree is a Leaf, I stop building his children - if(!isLeaf()) - buildChildren(); + if ( myBox ) + delete myBox; + myBox = 0; + if ( level() == 0 ) + delete myLimit; + myLimit = 0; } //================================================================= @@ -133,9 +94,12 @@ void SMESH_Octree::Compute() * \brief Build the 8 children boxes and call buildChildrenData() */ //================================================================= + void SMESH_Octree::buildChildren() { - myChildren = new (SMESH_Octree*)[8]; + if ( isLeaf() ) return; + + myChildren = new SMESH_Octree*[8]; gp_XYZ min = myBox->CornerMin(); gp_XYZ max = myBox->CornerMax(); @@ -144,12 +108,11 @@ void SMESH_Octree::buildChildren() gp_XYZ childHsize = HSize/2.; Standard_Real XminChild, YminChild, ZminChild; - Bnd_B3d* box; gp_XYZ minChild; - for (int i =0; i<8; i++) + for (int i = 0; i < 8; i++) { - // We build the eight boxes, we need 2 points to do that. - // Min, and Mid + // We build the eight boxes, we need 2 points to do that: + // Min and Mid // In binary, we can write i from 0 to 7 // For instance : // 5 is 101, it corresponds here in coordinates to ZYX @@ -158,24 +121,58 @@ void SMESH_Octree::buildChildren() // Same scheme for X and Z // I need the minChild to build the Bnd_B3d box. - XminChild= (i%2==0)?min.X():mid.X(); - YminChild= ((i%4)/2==0)?min.Y():mid.Y(); - ZminChild= (i<4)?min.Z():mid.Z(); + XminChild = (i%2==0)?min.X():mid.X(); + YminChild = ((i%4)/2==0)?min.Y():mid.Y(); + ZminChild = (i<4)?min.Z():mid.Z(); minChild.SetCoord(XminChild, YminChild, ZminChild); - box = new Bnd_B3d(minChild+childHsize,childHsize); // The child is of the same type than its father (For instance, a SMESH_OctreeNode) - // We allocate the memory we need fot the child + // We allocate the memory we need for the child myChildren[i] = allocateOctreeChild(); // and we assign to him its box. - myChildren[i]->setBox(box); - delete box; + myChildren[i]->myFather = this; + myChildren[i]->myLimit = myLimit; + myChildren[i]->myLevel = myLevel + 1; + myChildren[i]->myBox = new Bnd_B3d(minChild+childHsize,childHsize); + if ( myLimit->myMinBoxSize > 0. && myChildren[i]->maxSize() <= myLimit->myMinBoxSize ) + myChildren[i]->myIsLeaf = true; } - // After building the 8 boxes, we put the data into the children.. + // After building the 8 boxes, we put the data into the children. buildChildrenData(); //After we pass to the next level of the Octree - for (int i =0; i<8; i++) - myChildren[i]->Compute(); + for (int i = 0; i<8; i++) + myChildren[i]->buildChildren(); +} + +//================================================================================ +/*! + * \brief Tell if Octree is a leaf or not + * An inheriting class can influence it via myIsLeaf protected field + */ +//================================================================================ + +bool SMESH_Octree::isLeaf() const +{ + return myIsLeaf || ((myLimit->myMaxLevel > 0) ? (level() >= myLimit->myMaxLevel) : false ); +} + +//=========================================================================== +/*! + * \brief Compute the bigger dimension of my box + */ +//=========================================================================== + +double SMESH_Octree::maxSize() const +{ + if ( myBox ) + { + gp_XYZ min = myBox->CornerMin(); + gp_XYZ max = myBox->CornerMax(); + gp_XYZ Size = (max - min); + double returnVal = (Size.X()>Size.Y())?Size.X():Size.Y(); + return (returnVal>Size.Z())?returnVal:Size.Z(); + } + return 0.; }