mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
331 lines
9.6 KiB
C++
331 lines
9.6 KiB
C++
/*---------------------------------------------------------------------------*\
|
|
========= |
|
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
\\ / O peration |
|
|
\\ / A nd | Copyright (C) 1991-2007 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::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
|
|
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
#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
|
|
{
|
|
|
|
public:
|
|
|
|
// Static data members
|
|
|
|
static const treeBoundBox greatBox;
|
|
|
|
//- 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,
|
|
RIGHTBIT = 0x1 << RIGHT,
|
|
BOTTOMBIT = 0x1 << BOTTOM,
|
|
TOPBIT = 0x1 << TOP,
|
|
BACKBIT = 0x1 << BACK,
|
|
FRONTBIT = 0x1 << FRONT,
|
|
};
|
|
|
|
//- 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;
|
|
|
|
|
|
//- Face on which neighbour is
|
|
static direction neighbourFaceBits(const label&);
|
|
|
|
|
|
// Constructors
|
|
|
|
//- Construct null setting points to zero
|
|
inline treeBoundBox();
|
|
|
|
//- Construct from components
|
|
inline treeBoundBox(const point& min, const point& max);
|
|
|
|
//- Construct from components
|
|
inline treeBoundBox(const boundBox& bb);
|
|
|
|
//- Construct as the bounding box of the given pointField. Local
|
|
// processor domain only (no reduce as in boundBox)
|
|
treeBoundBox(const UList<point>& points);
|
|
|
|
//- Construct as subset of points
|
|
treeBoundBox(const UList<point>&, const labelList& meshPoints);
|
|
|
|
//- Construct from Istream
|
|
treeBoundBox(Istream&);
|
|
|
|
|
|
// Member functions
|
|
|
|
// Access
|
|
|
|
//- Smallest of length,height,width
|
|
inline scalar minDim() const;
|
|
|
|
//- Largest of length,height,width
|
|
inline scalar maxDim() const;
|
|
|
|
//- Average of length,height,width
|
|
inline scalar avgDim() const;
|
|
|
|
//- Typical dimension length,height,width
|
|
inline scalar typDim() const;
|
|
|
|
//- vertex coordinates. In octant coding.
|
|
pointField points() const;
|
|
|
|
|
|
// Check
|
|
|
|
//- Corner point given octant
|
|
inline point corner(const direction) const;
|
|
|
|
//- Calculates midpoint
|
|
inline point mid() 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. Midpoint calculated.
|
|
inline direction subOctant
|
|
(
|
|
const point& sample
|
|
) const;
|
|
|
|
//- Returns octant number given point. Midpoint provided.
|
|
static inline direction subOctant
|
|
(
|
|
const point& mid,
|
|
const point& sample
|
|
);
|
|
|
|
//- Returns octant number given point. Midpoint calculated.
|
|
// onEdge set if sample on edge of subOctant
|
|
inline direction subOctant
|
|
(
|
|
const point& mid,
|
|
bool& onEdge
|
|
) const;
|
|
|
|
//- Returns octant number given point. Midpoint provided.
|
|
// onEdge set if sample on edge of subOctant
|
|
static inline direction subOctant
|
|
(
|
|
const point& mid,
|
|
const point& sample,
|
|
bool& onEdge
|
|
);
|
|
|
|
//- Returns octant number given intersection. Midpoint provided.
|
|
// onEdge set if sample on edge of subOctant. If onEdge
|
|
// the direction vector determines which octant to use
|
|
// (acc. to which octant the sample would be if it were moved
|
|
// along dir)
|
|
static inline direction subOctant
|
|
(
|
|
const point& mid,
|
|
const vector& dir,
|
|
const point& sample,
|
|
bool& onEdge
|
|
);
|
|
|
|
//- Calculates optimal order to look for nearest to sample. First
|
|
// will be the octant containing the sample, second the octant
|
|
// with boundary nearest to the sample etc.
|
|
inline void searchOrder
|
|
(
|
|
const point& sample,
|
|
FixedList<direction, 8>& octantOrder
|
|
) const;
|
|
|
|
//- Intersects other boundingbox?
|
|
inline bool intersects(const treeBoundBox&) const;
|
|
|
|
//- Intersects segment; set point to intersection position,
|
|
// return true if intersection found.
|
|
// (intPt argument used during calculation even if not intersecting)
|
|
bool intersects(const point&, const point&, point& intPt) const;
|
|
|
|
//- fully contains bb
|
|
bool contains(const treeBoundBox& bb) const;
|
|
|
|
//- Contains point? (inside or on edge)
|
|
inline bool contains(const point&) const;
|
|
|
|
//- Contains point? (only inside)
|
|
bool containsNarrow(const point&) const;
|
|
|
|
//- 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;
|
|
|
|
//- Position of point relative to bb
|
|
direction posBits(const point&) const;
|
|
|
|
//- Calculate nearest and furthest (to sample) vertex coords of
|
|
// bounding box
|
|
void calcExtremities
|
|
(
|
|
const point& sample,
|
|
point& nearest,
|
|
point& furthest
|
|
) const;
|
|
|
|
//- Returns distance sample to furthest away corner.
|
|
scalar maxDist(const point& sample) 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()
|
|
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&, treeBoundBox&);
|
|
};
|
|
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
} // End namespace Foam
|
|
|
|
#include "treeBoundBoxI.H"
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
#endif
|
|
|
|
// ************************************************************************* //
|