diff options
author | bubnikv <bubnikv@gmail.com> | 2018-09-19 12:02:24 +0300 |
---|---|---|
committer | bubnikv <bubnikv@gmail.com> | 2018-09-19 12:02:24 +0300 |
commit | 0558b53493a77bae44831cf87bb0f59359828ef5 (patch) | |
tree | c3e8dbdf7d91a051c12d9ebbf7606d41047fea96 /src/libslic3r/ExPolygonCollection.cpp | |
parent | 3ddaccb6410478ad02d8c0e02d6d8e6eb1785b9f (diff) |
WIP: Moved sources int src/, separated most of the source code from Perl.
The XS was left only for the unit / integration tests, and it links
libslic3r only. No wxWidgets are allowed to be used from Perl starting
from now.
Diffstat (limited to 'src/libslic3r/ExPolygonCollection.cpp')
-rw-r--r-- | src/libslic3r/ExPolygonCollection.cpp | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/src/libslic3r/ExPolygonCollection.cpp b/src/libslic3r/ExPolygonCollection.cpp new file mode 100644 index 000000000..6933544b6 --- /dev/null +++ b/src/libslic3r/ExPolygonCollection.cpp @@ -0,0 +1,135 @@ +#include "ExPolygonCollection.hpp" +#include "Geometry.hpp" + +namespace Slic3r { + +ExPolygonCollection::ExPolygonCollection(const ExPolygon &expolygon) +{ + this->expolygons.push_back(expolygon); +} + +ExPolygonCollection::operator Points() const +{ + Points points; + Polygons pp = *this; + for (Polygons::const_iterator poly = pp.begin(); poly != pp.end(); ++poly) { + for (Points::const_iterator point = poly->points.begin(); point != poly->points.end(); ++point) + points.push_back(*point); + } + return points; +} + +ExPolygonCollection::operator Polygons() const +{ + Polygons polygons; + for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it) { + polygons.push_back(it->contour); + for (Polygons::const_iterator ith = it->holes.begin(); ith != it->holes.end(); ++ith) { + polygons.push_back(*ith); + } + } + return polygons; +} + +ExPolygonCollection::operator ExPolygons&() +{ + return this->expolygons; +} + +void +ExPolygonCollection::scale(double factor) +{ + for (ExPolygons::iterator it = expolygons.begin(); it != expolygons.end(); ++it) { + (*it).scale(factor); + } +} + +void +ExPolygonCollection::translate(double x, double y) +{ + for (ExPolygons::iterator it = expolygons.begin(); it != expolygons.end(); ++it) { + (*it).translate(x, y); + } +} + +void +ExPolygonCollection::rotate(double angle, const Point ¢er) +{ + for (ExPolygons::iterator it = expolygons.begin(); it != expolygons.end(); ++it) { + (*it).rotate(angle, center); + } +} + +template <class T> +bool ExPolygonCollection::contains(const T &item) const +{ + for (const ExPolygon &poly : this->expolygons) + if (poly.contains(item)) + return true; + return false; +} +template bool ExPolygonCollection::contains<Point>(const Point &item) const; +template bool ExPolygonCollection::contains<Line>(const Line &item) const; +template bool ExPolygonCollection::contains<Polyline>(const Polyline &item) const; + +bool +ExPolygonCollection::contains_b(const Point &point) const +{ + for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it) { + if (it->contains_b(point)) return true; + } + return false; +} + +void +ExPolygonCollection::simplify(double tolerance) +{ + ExPolygons expp; + for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it) { + it->simplify(tolerance, &expp); + } + this->expolygons = expp; +} + +Polygon +ExPolygonCollection::convex_hull() const +{ + Points pp; + for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it) + pp.insert(pp.end(), it->contour.points.begin(), it->contour.points.end()); + return Slic3r::Geometry::convex_hull(pp); +} + +Lines +ExPolygonCollection::lines() const +{ + Lines lines; + for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it) { + Lines ex_lines = it->lines(); + lines.insert(lines.end(), ex_lines.begin(), ex_lines.end()); + } + return lines; +} + +Polygons +ExPolygonCollection::contours() const +{ + Polygons contours; + contours.reserve(this->expolygons.size()); + for (ExPolygons::const_iterator it = this->expolygons.begin(); it != this->expolygons.end(); ++it) + contours.push_back(it->contour); + return contours; +} + +void +ExPolygonCollection::append(const ExPolygons &expp) +{ + this->expolygons.insert(this->expolygons.end(), expp.begin(), expp.end()); +} + +BoundingBox get_extents(const ExPolygonCollection &expolygon) +{ + return get_extents(expolygon.expolygons); +} + +} |