Add BoundingBox constructor with point set iterators
This commit is contained in:
parent
195b39bb5b
commit
7830c8f8aa
@ -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;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user