Added a new Slic3r::Geometry::simplify_polygons() function

This commit is contained in:
Alessandro Ranellucci 2015-01-30 18:33:20 +01:00
parent d4ba0f17bb
commit e2b1b52679
5 changed files with 36 additions and 4 deletions

View File

@ -129,14 +129,20 @@ ExPolygon::simplify_p(double tolerance) const
pp.reserve(this->holes.size() + 1); pp.reserve(this->holes.size() + 1);
// contour // contour
{
Polygon p = this->contour; Polygon p = this->contour;
p.points.push_back(p.points.front());
p.points = MultiPoint::_douglas_peucker(p.points, tolerance); p.points = MultiPoint::_douglas_peucker(p.points, tolerance);
p.points.pop_back();
pp.push_back(p); pp.push_back(p);
}
// holes // holes
for (Polygons::const_iterator it = this->holes.begin(); it != this->holes.end(); ++it) { for (Polygons::const_iterator it = this->holes.begin(); it != this->holes.end(); ++it) {
p = *it; Polygon p = *it;
p.points.push_back(p.points.front());
p.points = MultiPoint::_douglas_peucker(p.points, tolerance); p.points = MultiPoint::_douglas_peucker(p.points, tolerance);
p.points.pop_back();
pp.push_back(p); pp.push_back(p);
} }
simplify_polygons(pp, &pp); simplify_polygons(pp, &pp);

View File

@ -1,4 +1,5 @@
#include "Geometry.hpp" #include "Geometry.hpp"
#include "ClipperUtils.hpp"
#include "ExPolygon.hpp" #include "ExPolygon.hpp"
#include "Line.hpp" #include "Line.hpp"
#include "PolylineCollection.hpp" #include "PolylineCollection.hpp"
@ -146,6 +147,20 @@ deg2rad(double angle)
return PI * angle / 180.0; return PI * angle / 180.0;
} }
void
simplify_polygons(const Polygons &polygons, double tolerance, Polygons* retval)
{
Polygons pp;
for (Polygons::const_iterator it = polygons.begin(); it != polygons.end(); ++it) {
Polygon p = *it;
p.points.push_back(p.points.front());
p.points = MultiPoint::_douglas_peucker(p.points, tolerance);
p.points.pop_back();
pp.push_back(p);
}
Slic3r::simplify_polygons(pp, retval);
}
Line Line
MedialAxis::edge_to_line(const VD::edge_type &edge) const MedialAxis::edge_to_line(const VD::edge_type &edge) const
{ {

View File

@ -21,6 +21,7 @@ template<class T> bool contains(const std::vector<T> &vector, const Point &point
double rad2deg(double angle); double rad2deg(double angle);
double rad2deg_dir(double angle); double rad2deg_dir(double angle);
double deg2rad(double angle); double deg2rad(double angle);
void simplify_polygons(const Polygons &polygons, double tolerance, Polygons* retval);
class MedialAxis { class MedialAxis {
public: public:

View File

@ -147,6 +147,7 @@ Polygon::contains(const Point &point) const
return result; return result;
} }
// this only works on CCW polygons as CW will be ripped out by Clipper's simplify_polygons()
Polygons Polygons
Polygon::simplify(double tolerance) const Polygon::simplify(double tolerance) const
{ {

View File

@ -78,4 +78,13 @@ deg2rad(angle)
OUTPUT: OUTPUT:
RETVAL RETVAL
Polygons
simplify_polygons(polygons, tolerance)
Polygons polygons
double tolerance
CODE:
Slic3r::Geometry::simplify_polygons(polygons, tolerance, &RETVAL);
OUTPUT:
RETVAL
%} %}