Add BoundingBox constructor with point set iterators

This commit is contained in:
tamasmeszaros 2021-01-04 15:41:58 +01:00
parent 195b39bb5b
commit 7830c8f8aa

View File

@ -21,22 +21,30 @@ public:
min(pmin), max(pmax), defined(pmin(0) < pmax(0) && pmin(1) < pmax(1)) {} min(pmin), max(pmax), defined(pmin(0) < pmax(0) && pmin(1) < pmax(1)) {}
BoundingBoxBase(const PointClass &p1, const PointClass &p2, const PointClass &p3) : BoundingBoxBase(const PointClass &p1, const PointClass &p2, const PointClass &p3) :
min(p1), max(p1), defined(false) { merge(p2); merge(p3); } min(p1), max(p1), defined(false) { merge(p2); merge(p3); }
BoundingBoxBase(const std::vector<PointClass>& points) : min(PointClass::Zero()), max(PointClass::Zero())
template<class It, class = IteratorOnly<It> >
BoundingBoxBase(It from, It to) : min(PointClass::Zero()), max(PointClass::Zero())
{ {
if (points.empty()) { if (from == to) {
this->defined = false; this->defined = false;
// throw Slic3r::InvalidArgument("Empty point set supplied to BoundingBoxBase constructor"); // throw Slic3r::InvalidArgument("Empty point set supplied to BoundingBoxBase constructor");
} else { } else {
typename std::vector<PointClass>::const_iterator it = points.begin(); auto it = from;
this->min = *it; this->min = it->template cast<typename PointClass::Scalar>();
this->max = *it; this->max = this->min;
for (++ it; it != points.end(); ++ it) { for (++ it; it != to; ++ it) {
this->min = this->min.cwiseMin(*it); auto vec = it->template cast<typename PointClass::Scalar>();
this->max = this->max.cwiseMax(*it); this->min = this->min.cwiseMin(vec);
this->max = this->max.cwiseMax(vec);
} }
this->defined = (this->min(0) < this->max(0)) && (this->min(1) < this->max(1)); this->defined = (this->min(0) < this->max(0)) && (this->min(1) < this->max(1));
} }
} }
BoundingBoxBase(const std::vector<PointClass> &points)
: BoundingBoxBase(points.begin(), points.end())
{}
void reset() { this->defined = false; this->min = PointClass::Zero(); this->max = PointClass::Zero(); } void reset() { this->defined = false; this->min = PointClass::Zero(); this->max = PointClass::Zero(); }
void merge(const PointClass &point); void merge(const PointClass &point);
void merge(const std::vector<PointClass> &points); void merge(const std::vector<PointClass> &points);
@ -74,19 +82,27 @@ public:
{ if (pmin(2) >= pmax(2)) BoundingBoxBase<PointClass>::defined = false; } { if (pmin(2) >= pmax(2)) BoundingBoxBase<PointClass>::defined = false; }
BoundingBox3Base(const PointClass &p1, const PointClass &p2, const PointClass &p3) : BoundingBox3Base(const PointClass &p1, const PointClass &p2, const PointClass &p3) :
BoundingBoxBase<PointClass>(p1, p1) { merge(p2); merge(p3); } BoundingBoxBase<PointClass>(p1, p1) { merge(p2); merge(p3); }
BoundingBox3Base(const std::vector<PointClass>& points)
template<class It, class = IteratorOnly<It> > BoundingBox3Base(It from, It to)
{ {
if (points.empty()) if (from == to)
throw Slic3r::InvalidArgument("Empty point set supplied to BoundingBox3Base constructor"); throw Slic3r::InvalidArgument("Empty point set supplied to BoundingBox3Base constructor");
typename std::vector<PointClass>::const_iterator it = points.begin();
this->min = *it; auto it = from;
this->max = *it; this->min = it->template cast<typename PointClass::Scalar>();
for (++ it; it != points.end(); ++ it) { this->max = this->min;
this->min = this->min.cwiseMin(*it); for (++ it; it != to; ++ it) {
this->max = this->max.cwiseMax(*it); auto vec = it->template cast<typename PointClass::Scalar>();
this->min = this->min.cwiseMin(vec);
this->max = this->max.cwiseMax(vec);
} }
this->defined = (this->min(0) < this->max(0)) && (this->min(1) < this->max(1)) && (this->min(2) < this->max(2)); this->defined = (this->min(0) < this->max(0)) && (this->min(1) < this->max(1)) && (this->min(2) < this->max(2));
} }
BoundingBox3Base(const std::vector<PointClass> &points)
: BoundingBox3Base(points.begin(), points.end())
{}
void merge(const PointClass &point); void merge(const PointClass &point);
void merge(const std::vector<PointClass> &points); void merge(const std::vector<PointClass> &points);
void merge(const BoundingBox3Base<PointClass> &bb); void merge(const BoundingBox3Base<PointClass> &bb);
@ -188,9 +204,7 @@ public:
class BoundingBoxf3 : public BoundingBox3Base<Vec3d> class BoundingBoxf3 : public BoundingBox3Base<Vec3d>
{ {
public: public:
BoundingBoxf3() : BoundingBox3Base<Vec3d>() {} using BoundingBox3Base::BoundingBox3Base;
BoundingBoxf3(const Vec3d &pmin, const Vec3d &pmax) : BoundingBox3Base<Vec3d>(pmin, pmax) {}
BoundingBoxf3(const std::vector<Vec3d> &points) : BoundingBox3Base<Vec3d>(points) {}
BoundingBoxf3 transformed(const Transform3d& matrix) const; BoundingBoxf3 transformed(const Transform3d& matrix) const;
}; };