/* This file is part of the OpenLB library
*
* Copyright (C) 2015 Thomas Henn
* E-mail contact: info@openlb.net
* The most recent release of OpenLB can be downloaded at
*
*
* This program 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.
*
* This program 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 this program; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
/** \file
* Octree
*/
#ifndef OCTREE_H
#define OCTREE_H
#include
#include
#include "core/singleton.h"
#include "core/vector.h"
using namespace olb::util;
/// All OpenLB code is contained in this namespace.
namespace olb {
template
class STLmesh;
template
struct STLtriangle;
template
class Octree {
public:
/*
* Constructs Octree containing triangles of an STLmesh.
* \param center Centerpoint
* \param rad Radius
* \param mesh STLmesh
* \param maxDepth Maximal depth of tree
* \param overlap Triangles within rad+overlap are added to this Octree
*/
Octree(Vector center, T rad, STLmesh* mesh, short maxDepth, T overlap = 0., Octree* parent=nullptr);
/// Destructor destructs
~Octree();
/// Find the node containing the first param with remaining maxDepth
Octree* find(const Vector&,const int& maxDepth = 0);
/// Write Octree
void write(const Vector& pt, const std::string no);
/// Write Octree
void write(const int, const std::string);
/// Write Octree
void write(const std::string);
/// Test intersection of ray with all triangles in Octree
/// returns number of intersections
int testIntersection(const Vector& pt,const Vector& dir, bool print = false);
/// Test intersection of ray with all triangles in Octree
/// q contains point of closest intersection to pt in direction direction
bool closestIntersection(const Vector& pt, const Vector& direction, Vector& q, T& a);
/// Test intersection of ray with all triangles in Octree
/// q contains point of closest intersection to pt in direction direction
/// tri contains triangle with closest intersection
bool closestIntersection(const Vector& pt, const Vector& direction, Vector& q, T& a, STLtriangle& tri, const T& rad = 0., bool print = false);
/// Test intersection of sphere moving along ray with radius rad
/// q contains point of closest intersection to pt in direction direction
/// tri contains triangle with closest intersection
bool closestIntersectionSphere(const Vector& pt, const T& rad, const Vector& direction, Vector& q, T& a, STLtriangle& tri);
/// It's complicated. Computes intersections of a ray with triangles inside this Octree. Sets _inside depending on value of rayInside and changes rayInside depending on the number of intersections. Also takes into account if the intersections happen before or after the center.
void checkRay(const Vector& pt,const Vector& dir, unsigned short& rayInside);
/// Computes intersection of ray with Octree boundaries
void intersectRayNode(const Vector& pt, const Vector& dir, Vector& s);
/// Computes all centerpoints of Octree
void getCenterpoints(std::vector >& pts);
/// Collectes all leafs
void getLeafs(std::vector* >& pts);
/// Return status of _isLeaf;
bool isLeaf();
/// Sets Inside
inline void setInside(bool ins)
{
_inside = ins;
};
/// Gets Inside
inline bool getInside()
{
return _inside;
};
/// Gets _boundarNode
inline bool getBoundaryNode()
{
return _boundaryNode;
};
/// Gets Maxdepth
inline int getMaxdepth() const
{
return _maxDepth;
};
/// Gets numbers of triangles contained by this Octree
inline const std::vector& getTriangles() const
{
return _triangles;
};
/// Gets centerpoint
inline const Vector& getCenter() const
{
return _center;
};
/// Gets radius
inline const T getRadius() const
{
return _radius;
};
/// Prints console output
void print();
/// Returns set of indices of all triangles in nodes containing a line.
void trianglesOnLine(const Vector& pt1, const Vector& pt2, std::set& tris);
/// Returns reference to _mesh
inline STLmesh* getMesh()
{
return _mesh;
}
protected:
///_vector _triangles contains number of triangles
std::vector _triangles;
Vector _center;
T _radius;
STLmesh* _mesh;
short _maxDepth;
bool _isLeaf;
bool _boundaryNode;
bool _inside;
Octree *_parent;
Octree **_child;
void findTriangles(T overlap = 0.);
bool AABBTri(const STLtriangle& tri, T overlap = 0.);
};
}
#endif