Added 3D boxKDE

This commit is contained in:
2018-07-31 15:41:25 +02:00
parent 32870a62c6
commit 4aec7bae26
6 changed files with 803 additions and 33 deletions

View File

@@ -3,34 +3,37 @@
#include "Point3.h"
class BBox3 {
template <typename Scalar>
class _BBox3 {
private:
static constexpr float MAX = +99999;
static constexpr float MIN = -99999;
/** minimum */
Point3 p1;
_Point3<Scalar> p1;
/** maximum */
Point3 p2;
_Point3<Scalar> p2;
public:
/** empty ctor */
BBox3() : p1(MAX,MAX,MAX), p2(MIN,MIN,MIN) {;}
_BBox3() : p1(std::numeric_limits<Scalar>::max(),
std::numeric_limits<Scalar>::max(),
std::numeric_limits<Scalar>::max()),
p2(std::numeric_limits<Scalar>::lowest(),
std::numeric_limits<Scalar>::lowest(),
std::numeric_limits<Scalar>::lowest())
{;}
/** ctor with min and max */
BBox3(const Point3 min, const Point3 max) : p1(min), p2(max) {;}
_BBox3(const _Point3<Scalar> min, const _Point3<Scalar> max) : p1(min), p2(max) {;}
/** create a bbox around the given point */
static BBox3 around(const Point3 center, const Point3 size) {
return BBox3(center-size/2, center+size/2);
static _BBox3 around(const _Point3<Scalar> center, const _Point3<Scalar> size) {
return _BBox3(center-size/2, center+size/2);
}
/** adjust the bounding-box by adding this point */
void add(const Point3& p) {
void add(const _Point3<Scalar>& p) {
if (p.x > p2.x) {p2.x = p.x;}
if (p.y > p2.y) {p2.y = p.y;}
@@ -43,25 +46,25 @@ public:
}
/** add the given bounding-box to this one */
void add(const BBox3& bb) {
void add(const _BBox3& bb) {
add(bb.getMin());
add(bb.getMax());
}
/** get the bbox's minimum */
const Point3& getMin() const {return p1;}
const _Point3<Scalar>& getMin() const {return p1;}
/** get the bbox's maximum */
const Point3& getMax() const {return p2;}
const _Point3<Scalar>& getMax() const {return p2;}
/** get the bbox's size */
const Point3 getSize() const {return p2-p1;}
const _Point3<Scalar> getSize() const {return p2-p1;}
/** get the boox's center */
const Point3 getCenter() const {return (p2+p1)/2;}
const _Point3<Scalar> getCenter() const {return (p2+p1)/2;}
/** equal? */
bool operator == (const BBox3& o) const {
bool operator == (const _BBox3& o) const {
return (p1.x == o.p1.x) &&
(p1.y == o.p1.y) &&
(p1.z == o.p1.z) &&
@@ -71,38 +74,38 @@ public:
}
/** shrink the bbox in each dimension by the given amount */
void shrink(const float v) {
shrink(Point3(v,v,v));
void shrink(const Scalar v) {
shrink(_Point3<Scalar>(v,v,v));
}
/** shrink the bbox by the amount given for each dimension */
void shrink(const Point3& p) {
void shrink(const _Point3<Scalar>& p) {
p1 += p; // increase minimum
p2 -= p; // decrease maximum
}
/** grow the bbox by the amount given for each dimension */
void grow(const float v) {
grow(Point3(v,v,v));
void grow(const Scalar v) {
grow(_Point3<Scalar>(v,v,v));
}
/** grow the bbox by the amount given for each dimension */
void grow(const Point3& p) {
void grow(const _Point3<Scalar>& p) {
p1 -= p; // decrease minimum
p2 += p; // increase maximum
}
/** set both, min/max z to the same value */
void setZ(const float z) {
void setZ(const Scalar z) {
p1.z = z;
p2.z = z;
}
void setMinZ(const float z) {this->p1.z = z;}
void setMaxZ(const float z) {this->p2.z = z;}
void setMinZ(const Scalar z) {this->p1.z = z;}
void setMaxZ(const Scalar z) {this->p2.z = z;}
/** does the bbox contain the given point? */
bool contains(const Point3& p) const {
bool contains(const _Point3<Scalar>& p) const {
if (p.x < p1.x) {return false;}
if (p.x > p2.x) {return false;}
if (p.y < p1.y) {return false;}
@@ -113,12 +116,14 @@ public:
}
/** combine two bboxes */
static BBox3 join(const BBox3& bb1, const BBox3& bb2) {
const Point3 min( std::min(bb1.p1.x, bb2.p1.x), std::min(bb1.p1.y, bb2.p1.y), std::min(bb1.p1.z, bb2.p1.z) );
const Point3 max( std::max(bb1.p2.x, bb2.p2.x), std::max(bb1.p2.y, bb2.p2.y), std::max(bb1.p2.z, bb2.p2.z) );
return BBox3(min,max);
static _BBox3 join(const _BBox3& bb1, const _BBox3& bb2) {
const _Point3<Scalar> min( std::min(bb1.p1.x, bb2.p1.x), std::min(bb1.p1.y, bb2.p1.y), std::min(bb1.p1.z, bb2.p1.z) );
const _Point3<Scalar> max( std::max(bb1.p2.x, bb2.p2.x), std::max(bb1.p2.y, bb2.p2.y), std::max(bb1.p2.z, bb2.p2.z) );
return _BBox3(min,max);
}
};
using BBox3 = _BBox3<float>;
#endif // BBOX3_H