Commit eb59a31f authored by Tom Fischer's avatar Tom Fischer
Browse files

[GL/OctTree] Clang format.

parent aee33b9f
......@@ -10,43 +10,53 @@
* http://www.opengeosys.org/project/license
*/
namespace GeoLib {
namespace GeoLib
{
template <typename POINT, std::size_t MAX_POINTS>
template <typename T>
OctTree<POINT, MAX_POINTS>* OctTree<POINT, MAX_POINTS>::createOctTree(T ll, T ur,
double eps)
OctTree<POINT, MAX_POINTS>* OctTree<POINT, MAX_POINTS>::createOctTree(
T ll, T ur, double eps)
{
// compute an axis aligned cube around the points ll and ur
const double dx(ur[0] - ll[0]);
const double dy(ur[1] - ll[1]);
const double dz(ur[2] - ll[2]);
if (dx >= dy && dx >= dz) {
ll[1] -= (dx-dy)/2.0;
ur[1] += (dx-dy)/2.0;
ll[2] -= (dx-dz)/2.0;
ur[2] += (dx-dz)/2.0;
} else {
if (dy >= dx && dy >= dz) {
ll[0] -= (dy-dx)/2.0;
ur[0] += (dy-dx)/2.0;
ll[2] -= (dy-dz)/2.0;
ur[2] += (dy-dz)/2.0;
} else {
ll[0] -= (dz-dx)/2.0;
ur[0] += (dz-dx)/2.0;
ll[1] -= (dz-dy)/2.0;
ur[1] += (dz-dy)/2.0;
if (dx >= dy && dx >= dz)
{
ll[1] -= (dx - dy) / 2.0;
ur[1] += (dx - dy) / 2.0;
ll[2] -= (dx - dz) / 2.0;
ur[2] += (dx - dz) / 2.0;
}
else
{
if (dy >= dx && dy >= dz)
{
ll[0] -= (dy - dx) / 2.0;
ur[0] += (dy - dx) / 2.0;
ll[2] -= (dy - dz) / 2.0;
ur[2] += (dy - dz) / 2.0;
}
else
{
ll[0] -= (dz - dx) / 2.0;
ur[0] += (dz - dx) / 2.0;
ll[1] -= (dz - dy) / 2.0;
ur[1] += (dz - dy) / 2.0;
}
}
if (eps == 0.0)
{
eps = std::numeric_limits<double>::epsilon();
}
for (std::size_t k(0); k<3; ++k) {
if (ur[k] - ll[k] > 0.0) {
for (std::size_t k(0); k < 3; ++k)
{
if (ur[k] - ll[k] > 0.0)
{
ur[k] += (ur[k] - ll[k]) * 1e-6;
} else {
}
else
{
ur[k] += eps;
}
}
......@@ -63,19 +73,19 @@ OctTree<POINT, MAX_POINTS>::~OctTree()
}
template <typename POINT, std::size_t MAX_POINTS>
bool OctTree<POINT, MAX_POINTS>::addPoint(POINT * pnt, POINT *& ret_pnt)
bool OctTree<POINT, MAX_POINTS>::addPoint(POINT* pnt, POINT*& ret_pnt)
{
// first do a range query using a epsilon box around the point pnt
std::vector<POINT*> query_pnts;
MathLib::Point3d min(
std::array<double,3>{{(*pnt)[0]-_eps, (*pnt)[1]-_eps, (*pnt)[2]-_eps}});
MathLib::Point3d max(
std::array<double,3>{{(*pnt)[0]+_eps, (*pnt)[1]+_eps, (*pnt)[2]+_eps}});
MathLib::Point3d min(std::array<double, 3>{
{(*pnt)[0] - _eps, (*pnt)[1] - _eps, (*pnt)[2] - _eps}});
MathLib::Point3d max(std::array<double, 3>{
{(*pnt)[0] + _eps, (*pnt)[1] + _eps, (*pnt)[2] + _eps}});
getPointsInRange(min, max, query_pnts);
auto const it = std::find_if(
query_pnts.begin(), query_pnts.end(), [pnt, this](auto const* p) {
return MathLib::sqrDist(*p, *pnt) < _eps * _eps;
});
auto const it =
std::find_if(query_pnts.begin(), query_pnts.end(),
[pnt, this](auto const* p)
{ return MathLib::sqrDist(*p, *pnt) < _eps * _eps; });
if (it != query_pnts.end())
{
ret_pnt = *it;
......@@ -83,15 +93,19 @@ bool OctTree<POINT, MAX_POINTS>::addPoint(POINT * pnt, POINT *& ret_pnt)
}
// the point pnt is not yet in the OctTree
if (isOutside(pnt)) {
if (isOutside(pnt))
{
ret_pnt = nullptr;
return false;
}
// at this place it holds true that the point is within [_ll, _ur]
if (!_is_leaf) {
for (auto c : _children) {
if (c->addPoint_(pnt, ret_pnt)) {
if (!_is_leaf)
{
for (auto c : _children)
{
if (c->addPoint_(pnt, ret_pnt))
{
return true;
}
if (ret_pnt != nullptr)
......@@ -103,9 +117,12 @@ bool OctTree<POINT, MAX_POINTS>::addPoint(POINT * pnt, POINT *& ret_pnt)
ret_pnt = pnt;
if (_pnts.size () < MAX_POINTS) {
if (_pnts.size() < MAX_POINTS)
{
_pnts.push_back(pnt);
} else { // i.e. _pnts.size () == MAX_POINTS
}
else
{ // i.e. _pnts.size () == MAX_POINTS
splitNode(pnt);
_pnts.clear();
}
......@@ -114,8 +131,8 @@ bool OctTree<POINT, MAX_POINTS>::addPoint(POINT * pnt, POINT *& ret_pnt)
template <typename POINT, std::size_t MAX_POINTS>
template <typename T>
void OctTree<POINT, MAX_POINTS>::getPointsInRange(T const& min, T const& max,
std::vector<POINT*> &pnts) const
void OctTree<POINT, MAX_POINTS>::getPointsInRange(
T const& min, T const& max, std::vector<POINT*>& pnts) const
{
if (_ur[0] < min[0] || _ur[1] < min[1] || _ur[2] < min[2])
{
......@@ -127,40 +144,49 @@ void OctTree<POINT, MAX_POINTS>::getPointsInRange(T const& min, T const& max,
return;
}
if (_is_leaf) {
if (_is_leaf)
{
std::copy_if(_pnts.begin(), _pnts.end(), std::back_inserter(pnts),
[&min, &max](auto const* p) {
[&min, &max](auto const* p)
{
return (min[0] <= (*p)[0] && (*p)[0] < max[0] &&
min[1] <= (*p)[1] && (*p)[1] < max[1] &&
min[2] <= (*p)[2] && (*p)[2] < max[2]);
});
} else {
for (std::size_t k(0); k<8; k++) {
}
else
{
for (std::size_t k(0); k < 8; k++)
{
_children[k]->getPointsInRange(min, max, pnts);
}
}
}
template <typename POINT, std::size_t MAX_POINTS>
OctTree<POINT, MAX_POINTS>::OctTree(
MathLib::Point3d const& ll, MathLib::Point3d const& ur, double eps)
OctTree<POINT, MAX_POINTS>::OctTree(MathLib::Point3d const& ll,
MathLib::Point3d const& ur, double eps)
: _ll(ll), _ur(ur), _is_leaf(true), _eps(eps)
{
_children.fill(nullptr);
}
template <typename POINT, std::size_t MAX_POINTS>
bool OctTree<POINT, MAX_POINTS>::addPoint_(POINT * pnt, POINT *& ret_pnt)
bool OctTree<POINT, MAX_POINTS>::addPoint_(POINT* pnt, POINT*& ret_pnt)
{
if (isOutside(pnt)) {
if (isOutside(pnt))
{
ret_pnt = nullptr;
return false;
}
// at this place it holds true that the point is within [_ll, _ur]
if (!_is_leaf) {
for (auto c : _children) {
if (c->addPoint_(pnt, ret_pnt)) {
if (!_is_leaf)
{
for (auto c : _children)
{
if (c->addPoint_(pnt, ret_pnt))
{
return true;
}
if (ret_pnt != nullptr)
......@@ -171,9 +197,12 @@ bool OctTree<POINT, MAX_POINTS>::addPoint_(POINT * pnt, POINT *& ret_pnt)
}
ret_pnt = pnt;
if (_pnts.size() < MAX_POINTS) {
if (_pnts.size() < MAX_POINTS)
{
_pnts.push_back(pnt);
} else { // i.e. _pnts.size () == MAX_POINTS
}
else
{ // i.e. _pnts.size () == MAX_POINTS
splitNode(pnt);
_pnts.clear();
}
......@@ -181,16 +210,19 @@ bool OctTree<POINT, MAX_POINTS>::addPoint_(POINT * pnt, POINT *& ret_pnt)
}
template <typename POINT, std::size_t MAX_POINTS>
bool OctTree<POINT, MAX_POINTS>::addPointToChild(POINT * pnt)
bool OctTree<POINT, MAX_POINTS>::addPointToChild(POINT* pnt)
{
if (isOutside(pnt))
{
return false;
}
if (_pnts.size() < MAX_POINTS) {
if (_pnts.size() < MAX_POINTS)
{
_pnts.push_back(pnt);
} else { // i.e. _pnts.size () == MAX_POINTS
}
else
{ // i.e. _pnts.size () == MAX_POINTS
splitNode(pnt);
_pnts.clear();
}
......@@ -198,39 +230,39 @@ bool OctTree<POINT, MAX_POINTS>::addPointToChild(POINT * pnt)
}
template <typename POINT, std::size_t MAX_POINTS>
void OctTree<POINT, MAX_POINTS>::splitNode(POINT * pnt)
void OctTree<POINT, MAX_POINTS>::splitNode(POINT* pnt)
{
const double x_mid((_ur[0] + _ll[0]) / 2.0);
const double y_mid((_ur[1] + _ll[1]) / 2.0);
const double z_mid((_ur[2] + _ll[2]) / 2.0);
MathLib::Point3d p0(std::array<double,3>{{x_mid, y_mid, _ll[2]}});
MathLib::Point3d p1(std::array<double,3>{{_ur[0], _ur[1], z_mid}});
MathLib::Point3d p0(std::array<double, 3>{{x_mid, y_mid, _ll[2]}});
MathLib::Point3d p1(std::array<double, 3>{{_ur[0], _ur[1], z_mid}});
// create child NEL
_children[static_cast<std::int8_t>(Quadrant::NEL)]
= new OctTree<POINT, MAX_POINTS> (p0, p1, _eps);
_children[static_cast<std::int8_t>(Quadrant::NEL)] =
new OctTree<POINT, MAX_POINTS>(p0, p1, _eps);
// create child NWL
p0[0] = _ll[0];
p1[0] = x_mid;
_children[static_cast<std::int8_t>(Quadrant::NWL)]
= new OctTree<POINT, MAX_POINTS> (p0, p1, _eps);
_children[static_cast<std::int8_t>(Quadrant::NWL)] =
new OctTree<POINT, MAX_POINTS>(p0, p1, _eps);
// create child SWL
p0[1] = _ll[1];
p1[1] = y_mid;
_children[static_cast<std::int8_t>(Quadrant::SWL)]
= new OctTree<POINT, MAX_POINTS> (_ll, p1, _eps);
_children[static_cast<std::int8_t>(Quadrant::SWL)] =
new OctTree<POINT, MAX_POINTS>(_ll, p1, _eps);
// create child NEU
_children[static_cast<std::int8_t>(Quadrant::NEU)]
= new OctTree<POINT, MAX_POINTS> (p1, _ur, _eps);
_children[static_cast<std::int8_t>(Quadrant::NEU)] =
new OctTree<POINT, MAX_POINTS>(p1, _ur, _eps);
// create child SEL
p0[0] = x_mid;
p1[0] = _ur[0];
_children[static_cast<std::int8_t>(Quadrant::SEL)]
= new OctTree<POINT, MAX_POINTS> (p0, p1, _eps);
_children[static_cast<std::int8_t>(Quadrant::SEL)] =
new OctTree<POINT, MAX_POINTS>(p0, p1, _eps);
// create child NWU
p0[0] = _ll[0];
......@@ -239,25 +271,26 @@ void OctTree<POINT, MAX_POINTS>::splitNode(POINT * pnt)
p1[0] = x_mid;
p1[1] = _ur[1];
p1[2] = _ur[2];
_children[static_cast<std::int8_t>(Quadrant::NWU)]
= new OctTree<POINT, MAX_POINTS> (p0, p1, _eps);
_children[static_cast<std::int8_t>(Quadrant::NWU)] =
new OctTree<POINT, MAX_POINTS>(p0, p1, _eps);
// create child SWU
p0[1] = _ll[1];
p1[1] = y_mid;
_children[static_cast<std::int8_t>(Quadrant::SWU)]
= new OctTree<POINT, MAX_POINTS> (p0, p1, _eps);
_children[static_cast<std::int8_t>(Quadrant::SWU)] =
new OctTree<POINT, MAX_POINTS>(p0, p1, _eps);
// create child SEU
p0[0] = x_mid;
p1[0] = _ur[0];
p1[1] = y_mid;
p1[2] = _ur[2];
_children[static_cast<std::int8_t>(Quadrant::SEU)]
= new OctTree<POINT, MAX_POINTS> (p0, p1, _eps);
_children[static_cast<std::int8_t>(Quadrant::SEU)] =
new OctTree<POINT, MAX_POINTS>(p0, p1, _eps);
// add the passed point pnt to the children at first
for (std::size_t k(0); k < 8; k++) {
for (std::size_t k(0); k < 8; k++)
{
if (_children[k]->addPointToChild(pnt))
{
break;
......@@ -266,9 +299,12 @@ void OctTree<POINT, MAX_POINTS>::splitNode(POINT * pnt)
// distribute points to sub quadtrees
const std::size_t n_pnts(_pnts.size());
for (std::size_t j(0); j < n_pnts; j++) {
for (auto c : _children) {
if (c->addPointToChild(_pnts[j])) {
for (std::size_t j(0); j < n_pnts; j++)
{
for (auto c : _children)
{
if (c->addPointToChild(_pnts[j]))
{
break;
}
}
......@@ -277,7 +313,7 @@ void OctTree<POINT, MAX_POINTS>::splitNode(POINT * pnt)
}
template <typename POINT, std::size_t MAX_POINTS>
bool OctTree<POINT, MAX_POINTS>::isOutside(POINT * pnt) const
bool OctTree<POINT, MAX_POINTS>::isOutside(POINT* pnt) const
{
if ((*pnt)[0] < _ll[0] || (*pnt)[1] < _ll[1] || (*pnt)[2] < _ll[2])
{
......@@ -289,5 +325,4 @@ bool OctTree<POINT, MAX_POINTS>::isOutside(POINT * pnt) const
}
return false;
}
} // end namespace GeoLib
} // end namespace GeoLib
......@@ -15,18 +15,19 @@
#pragma once
#include <cstdint>
#include <vector>
#include <limits>
#include <vector>
#include "MathLib/MathTools.h"
#include "MathLib/Point3d.h"
namespace GeoLib {
namespace GeoLib
{
/// @tparam POINT point data type the OctTree will use
/// @tparam MAX_POINTS maximum number of pointers of POINT in a leaf
template <typename POINT, std::size_t MAX_POINTS>
class OctTree {
class OctTree
{
public:
/// Create an OctTree object. The arguments ll and ur are used to compute a
/// cube domain the OctTree will living in.
......@@ -45,8 +46,8 @@ public:
/// inside a OctTree leaf may be more expensive. The value should be
/// chosen application dependent. [default 8]
template <typename T>
static OctTree<POINT, MAX_POINTS>* createOctTree(T ll, T ur,
double eps = std::numeric_limits<double>::epsilon());
static OctTree<POINT, MAX_POINTS>* createOctTree(
T ll, T ur, double eps = std::numeric_limits<double>::epsilon());
/// Destroys the children of this node. @attention Does not destroy the
/// pointers to the managed objects.
......@@ -64,14 +65,15 @@ public:
/// (3) In case ret_pnt is neither equal to pnt nor equal to nullptr,
/// another item within the eps distance is already in the OctTree and the
/// pointer to this object is returned.
/// @return If the point can be inserted the method returns true, else false.
bool addPoint(POINT * pnt, POINT *& ret_pnt);
/// @return If the point can be inserted the method returns true, else
/// false.
bool addPoint(POINT* pnt, POINT*& ret_pnt);
/// range query - returns all points inside the range [min[0], max[0]) x
/// [min[1], max[1]) x [min[2], max[2])
template <typename T>
void
getPointsInRange(T const& min, T const& max, std::vector<POINT*> &pnts) const;
void getPointsInRange(T const& min, T const& max,
std::vector<POINT*>& pnts) const;
#ifndef NDEBUG
MathLib::Point3d const& getLowerLeftCornerPoint() const { return _ll; }
......@@ -90,22 +92,24 @@ private:
/// @param eps the euclidean distance as a threshold to make objects unique
OctTree(MathLib::Point3d const& ll, MathLib::Point3d const& ur, double eps);
enum class Quadrant : std::int8_t {
NEL = 0, //!< north east lower
NWL, //!< north west lower
SWL, //!< south west lower
SEL, //!< south east lower
NEU, //!< south west upper
NWU, //!< south west upper
SWU, //!< south west upper
SEU //!< south east upper
enum class Quadrant : std::int8_t
{
NEL = 0, //!< north east lower
NWL, //!< north west lower
SWL, //!< south west lower
SEL, //!< south east lower
NEU, //!< south west upper
NWU, //!< south west upper
SWU, //!< south west upper
SEU //!< south east upper
};
/// This method tries to add the given point to the OctTree. If necessary
/// for adding the point, new nodes will be inserted into the OctTree.
/// @param pnt, ret_pnt see documentation of addPoint()
/// @return If the point can be inserted the method returns true, else false.
bool addPoint_(POINT * pnt, POINT *& ret_pnt);
/// @return If the point can be inserted the method returns true, else
/// false.
bool addPoint_(POINT* pnt, POINT*& ret_pnt);
/**
* This method adds the given point to the OctTree. If necessary,
......@@ -118,12 +122,12 @@ private:
/// Creates the child nodes of this leaf and distribute the points stored
/// in _pnts to the children.
/// @param pnt the pointer to the points that is responsible for the split
void splitNode(POINT * pnt);
void splitNode(POINT* pnt);
/// checks if the given point pnt is outside of the OctTree node.
/// @param pnt the point that check is performed on
/// @return true if the point is outside of the OctTree node.
bool isOutside(POINT * pnt) const;
bool isOutside(POINT* pnt) const;
/// children are sorted:
/// _children[0] is north east lower child
......@@ -147,6 +151,6 @@ private:
double const _eps;
};
} // end namespace GeoLib
} // end namespace GeoLib
#include "OctTree-impl.h"
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment