This repository has been archived on 2020-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
Files
Indoor/geo/BBox2.h
FrankE 34e52cd7f0 worked on floorplan (v2)
worked on grid-generation (v2)
new helper methods for geometry
new test cases
2016-07-13 19:11:18 +02:00

103 lines
2.2 KiB
C++

#ifndef BBOX2_H
#define BBOX2_H
#include "Point2.h"
#include "Line2.h"
class BBox2 {
protected:
static constexpr float MAX = +99999;
static constexpr float MIN = -99999;
/** minimum */
Point2 p1;
/** maximum */
Point2 p2;
public:
/** empty ctor */
BBox2() : p1(MAX,MAX), p2(MIN,MIN) {;}
/** ctor */
BBox2(const Point2& p1, const Point2& p2) : p1(p1), p2(p2) {;}
/** adjust the bounding-box by adding this point */
void add(const Point2& p) {
if (p.x > p2.x) {p2.x = p.x;}
if (p.y > p2.y) {p2.y = p.y;}
if (p.x < p1.x) {p1.x = p.x;}
if (p.y < p1.y) {p1.y = p.y;}
}
/** get the bbox's minimum */
const Point2& getMin() const {return p1;}
/** get the bbox's maximum */
const Point2& getMax() const {return p2;}
/** get the bbox's center point */
Point2 getCenter() const { return (p1+p2) / 2; }
/** equal? */
bool operator == (const BBox2& o) const {
return (p1.x == o.p1.x) &&
(p1.y == o.p1.y) &&
(p2.x == o.p2.x) &&
(p2.y == o.p2.y);
}
/** does the BBox intersect with the given line? */
bool intersects (const Line2& l) const {
const Line2 l1(p1.x, p1.y, p2.x, p1.y); // upper
const Line2 l2(p1.x, p2.y, p2.x, p2.y); // lower
const Line2 l3(p1.x, p1.y, p1.x, p2.y); // left
const Line2 l4(p2.x, p1.y, p2.x, p2.y); // right
return l.getSegmentIntersection(l1) ||
l.getSegmentIntersection(l2) ||
l.getSegmentIntersection(l3) ||
l.getSegmentIntersection(l4);
}
std::vector<Line2> lines() const {
return std::vector<Line2>(
{
Line2(p1.x, p1.y, p2.x, p1.y),
Line2(p1.x, p2.y, p2.x, p2.y),
Line2(p1.x, p1.y, p1.x, p2.y),
Line2(p2.x, p1.y, p2.x, p2.y)
}
);
}
bool contains(const Point2& p) const {
if (p.x < p1.x) {return false;}
if (p.x > p2.x) {return false;}
if (p.y < p1.y) {return false;}
if (p.y > p2.y) {return false;}
return true;
}
/** grow the bbox by the amount given for each dimension */
void grow(const Point2& p) {
p1 -= p; // decrease minimum
p2 += p; // increase maximum
}
/** grow the bbox by the amount given for each dimension */
void grow(const float val) {
p1 -= Point2(val, val); // decrease minimum
p2 += Point2(val, val); // increase maximum
}
};
#endif // BBOX2_H