/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License This file is part of OpenFOAM. OpenFOAM is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. OpenFOAM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenFOAM; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Class Foam::treeNode Description Class to implement octree. Holds the pointers to subcubes. These are either other treeNodes or treeLeafs. treeLeafs hold the actual data as a list of indices into octreeData. To prevent calculation errors all bb's used in octrees are calculated only once. The pointers to either treeNode/treeLeaf are implemented 'by hand' (explicitly marking type) instead of using a proper virtual mechanism to save some space in the treeLeaves. SourceFiles treeNode.C \*---------------------------------------------------------------------------*/ #ifndef treeNode_H #define treeNode_H #include "treeBoundBoxList.H" #include "treeElem.H" #include "linePointRef.H" #include "HashSet.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { // class intersection; template class octree; template class treeLeaf; template class treeNode; // Forward declaration of friend functions and operators template Istream& operator>>(Istream&, treeNode&); template Ostream& operator<<(Ostream&, const treeNode&); /*---------------------------------------------------------------------------*\ Class treeNodeName Declaration \*---------------------------------------------------------------------------*/ TemplateName(treeNode); /*---------------------------------------------------------------------------*\ Class treeNode Declaration \*---------------------------------------------------------------------------*/ template class treeNode : public treeElem, public treeNodeName { // Private data //- position of midPoint const point mid_; //- Type stored in subNodes_ unsigned char subNodeTypes_; //- Pointers to sub treeNode or treeLeaf treeElem* subNodes_[8]; //- Constant valid for whole subNode/leaf label volType_; // Static data members //- empty labelList to satisfy compiler static const labelList dummy; //- leaf offset for octant index static const label leafOffset; // Private Member Functions //- mark pointer to subnode as being a treeNode* void setAsNode(const label octant); //- mark pointer to subnode as being a treeLeaf* void setAsLeaf(const label octant); //- Set pointer to sub node void setNodePtr(const label octant, treeElem* treeNodePtr); //- Set pointer to sub leaf void setLeafPtr(const label octant, treeElem* treeLeafPtr); //- Set type of octant void setVolType(const label octant, const label type); //- Get type of octant inline label getVolType(const label octant) const; //- Find first leaf on line start-end. Updates start. const treeLeaf* findLeafLineOctant ( const int level, const Type& shapes, const label octant, const vector& direction, point& start, const point& end ) const; //- Print spaces static void space(Ostream&, const label); //- Disallow default bitwise copy construct treeNode(const treeNode&); //- Disallow default bitwise assignment void operator=(const treeNode&); public: // Constructors //- Construct from components treeNode(const treeBoundBox& bb); //- Construct from Istream treeNode(Istream&); // Destructor ~treeNode(); // Member Functions // Access //- position of midPoint const point& mid() const; //- array of 8 subNodes/leaves inline treeElem* const* subNodes() const; //- octant contains pointer to treeNode(1) or treeLeaf(0) inline label isNode(const label octant) const; //- Get pointer to sub node inline treeNode* getNodePtr(const label octant) const; //- Get pointer to sub leaf inline treeLeaf* getLeafPtr(const label octant) const; // Edit //- Take list of shapes and distribute over the 8 octants void distribute ( const label, octree&, const Type& shapes, const labelList& ); //- Distribute at certain level only void redistribute ( const label, octree&, const Type& shapes, const label ); //- Set type of subnodes label setSubNodeType ( const label level, octree& top, const Type& shapes ); // Search //- Find type of node sample is in. Used for inside/outside // determination label getSampleType ( const label level, const octree& top, const Type& shapes, const point& sample ) const; //- Find index of shape containing sample. label find ( const Type& shapes, const point& sample ) const; //- Find tightest bounding box around sample which is guaranteed // to hold at least one cell. // Current best bb in tightest, // returns true if newTightest has changed, 0 otherwise. bool findTightest ( const Type& shapes, const point& sample, treeBoundBox& tightest ) const; //- Find nearest shape to sample // Returns true if found nearer shape and updates // tightest, tightesti, tightestDist bool findNearest ( const Type& shapes, const point& sample, treeBoundBox& tightest, label& tightesti, scalar& tightestDist ) const; //- Find nearest shape to line // Returns true if found nearer shape and updates nearest and // tightest bool findNearest ( const Type& shapes, const linePointRef& ln, treeBoundBox& tightest, label& tightesti, // index of nearest shape point& linePoint, // nearest point on line point& shapePoint // nearest point on shape ) const; //- Find shapes not outside box. Return true if anything found. bool findBox ( const Type& shapes, const boundBox& bb, labelHashSet& elements ) const; //- Find treeLeaves intersecting line segment [start..end] // Updates: start const treeLeaf* findLeafLine ( const label level, const Type& shapes, point& start, const point& end ) const; //- Collect all treeLeafs in leafArray. leafIndex points to first // empty slot in leafArray and gets updated. void findLeaves ( List*>& leafArray, label& leafIndex ) const; //- Same but for const. void findLeaves ( List*>& leafArray, label& leafIndex ) const; // Write //- Print contents of node. void printNode ( Ostream& os, const label level ) const; //- Write subleafs in OBJ format. void writeOBJ ( Ostream& os, const label level, label& vertNo ) const; // IOstream Operators friend Istream& operator>> (Istream&, treeNode&); friend Ostream& operator<< (Ostream&, const treeNode&); }; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam #include "treeNodeI.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #ifdef NoRepository # include "treeNode.C" #endif // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif // ************************************************************************* //