/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2004-2011 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 3 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, see . Class Foam::treeBoundBox Description Standard boundBox + extra functionality for use in octree. Numbering of corner points is according to octant numbering. On the back plane (z=0): \verbatim Y ^ | +--------+ |2 3| | | | | | | |0 1| +--------+->X \endverbatim For the front plane add 4 to the point labels. SourceFiles treeBoundBoxI.H treeBoundBox.C treeBoundBoxTemplates.C \*---------------------------------------------------------------------------*/ #ifndef treeBoundBox_H #define treeBoundBox_H #include "boundBox.H" #include "direction.H" #include "pointField.H" #include "faceList.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { class Random; /*---------------------------------------------------------------------------*\ Class treeBoundBox Declaration \*---------------------------------------------------------------------------*/ class treeBoundBox : public boundBox { private: //- To initialise edges. static edgeList calcEdges(const label[12][2]); //- To initialise faceNormals. static FixedList calcFaceNormals(); public: // Static data members //- The great value used for greatBox and invertedBox static const scalar great; //- As per boundBox::greatBox, but with GREAT instead of VGREAT static const treeBoundBox greatBox; //- As per boundBox::invertedBox, but with GREAT instead of VGREAT static const treeBoundBox invertedBox; //- Bits used for octant/point coding. // Every octant/corner point is the combination of three faces. enum octantBit { RIGHTHALF = 0x1 << 0, TOPHALF = 0x1 << 1, FRONTHALF = 0x1 << 2 }; //- Face codes enum faceId { LEFT = 0, RIGHT = 1, BOTTOM = 2, TOP = 3, BACK = 4, FRONT = 5 }; //- Bits used for face coding enum faceBit { NOFACE = 0, LEFTBIT = 0x1 << LEFT, //1 RIGHTBIT = 0x1 << RIGHT, //2 BOTTOMBIT = 0x1 << BOTTOM, //4 TOPBIT = 0x1 << TOP, //8 BACKBIT = 0x1 << BACK, //16 FRONTBIT = 0x1 << FRONT, //32 }; //- Edges codes. // E01 = edge between 0 and 1. enum edgeId { E01 = 0, E13 = 1, E23 = 2, E02 = 3, E45 = 4, E57 = 5, E67 = 6, E46 = 7, E04 = 8, E15 = 9, E37 = 10, E26 = 11 }; //- Face to point addressing static const faceList faces; //- Edge to point addressing static const edgeList edges; //- Per face the unit normal static const FixedList faceNormals; // Constructors //- Construct null setting points to zero inline treeBoundBox(); //- Construct from a boundBox explicit inline treeBoundBox(const boundBox& bb); //- Construct from components inline treeBoundBox(const point& min, const point& max); //- Construct as the bounding box of the given pointField. // Local processor domain only (no reduce as in boundBox) explicit treeBoundBox(const UList&); //- Construct as subset of points // Local processor domain only (no reduce as in boundBox) treeBoundBox(const UList&, const labelUList& indices); //- Construct as subset of points // The indices could be from edge/triFace etc. // Local processor domain only (no reduce as in boundBox) template treeBoundBox ( const UList&, const FixedList& indices ); //- Construct from Istream inline treeBoundBox(Istream&); // Member functions // Access //- Typical dimension length,height,width inline scalar typDim() const; //- vertex coordinates. In octant coding. tmp points() const; // Check //- Corner point given octant inline point corner(const direction) const; //- Sub box given by octant number. Midpoint calculated. treeBoundBox subBbox(const direction) const; //- Sub box given by octant number. Midpoint provided. treeBoundBox subBbox(const point& mid, const direction) const; //- Returns octant number given point and the calculated midpoint. inline direction subOctant ( const point& pt ) const; //- Returns octant number given point and midpoint. static inline direction subOctant ( const point& mid, const point& pt ); //- Returns octant number given point and the calculated midpoint. // onEdge set if the point is on edge of subOctant inline direction subOctant ( const point& pt, bool& onEdge ) const; //- Returns octant number given point and midpoint. // onEdge set if the point is on edge of subOctant static inline direction subOctant ( const point& mid, const point& pt, bool& onEdge ); //- Returns octant number given intersection and midpoint. // onEdge set if the point is on edge of subOctant // If onEdge, the direction vector determines which octant to use // (acc. to which octant the point would be if it were moved // along dir) static inline direction subOctant ( const point& mid, const vector& dir, const point& pt, bool& onEdge ); //- Calculates optimal order to look for nearest to point. // First will be the octant containing the point, // second the octant with boundary nearest to the point etc. inline void searchOrder ( const point& pt, FixedList& octantOrder ) const; //- Overlaps other bounding box? using boundBox::overlaps; //- Overlaps boundingSphere (centre + sqr(radius))? bool overlaps(const point&, const scalar radiusSqr) const; //- Intersects segment; set point to intersection position and face, // return true if intersection found. // (pt argument used during calculation even if not intersecting). // Calculates intersections from outside supplied vector // (overallStart, overallVec). This is so when // e.g. tracking through lots of consecutive boxes // (typical octree) we're not accumulating truncation errors. Set // to start, (end-start) if not used. bool intersects ( const point& overallStart, const vector& overallVec, const point& start, const point& end, point& pt, direction& ptBits ) const; //- Like above but does not return faces point is on bool intersects ( const point& start, const point& end, point& pt ) const; //- Contains point or other bounding box? using boundBox::contains; //- Contains point (inside or on edge) and moving in direction // dir would cause it to go inside. bool contains(const vector& dir, const point&) const; //- Code position of point on bounding box faces direction faceBits(const point&) const; //- Position of point relative to bounding box direction posBits(const point&) const; //- Calculate nearest and furthest (to point) vertex coords of // bounding box void calcExtremities ( const point& pt, point& nearest, point& furthest ) const; //- Returns distance point to furthest away corner. scalar maxDist(const point&) const; //- Compare distance to point with other bounding box // return: // -1 : all vertices of my bounding box are nearer than any of // other // +1 : all vertices of my bounding box are further away than // any of other // 0 : none of the above. label distanceCmp(const point&, const treeBoundBox& other) const; //- Return slightly wider bounding box // Extends all dimensions with s*span*Random::scalar01() // and guarantees in any direction s*mag(span) minimum width inline treeBoundBox extend(Random&, const scalar s) const; // Friend Operators friend bool operator==(const treeBoundBox&, const treeBoundBox&); friend bool operator!=(const treeBoundBox&, const treeBoundBox&); // IOstream operator friend Istream& operator>>(Istream& is, treeBoundBox&); friend Ostream& operator<<(Ostream& os, const treeBoundBox&); }; //- Data associated with treeBoundBox type are contiguous template<> inline bool contiguous() {return contiguous();} // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam #include "treeBoundBoxI.H" #ifdef NoRepository # include "treeBoundBoxTemplates.C" #endif // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif // ************************************************************************* //