Added a new Slic3r::Geometry::simplify_polygons() function
This commit is contained in:
parent
d4ba0f17bb
commit
e2b1b52679
@ -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;
|
{
|
||||||
p.points = MultiPoint::_douglas_peucker(p.points, tolerance);
|
Polygon p = this->contour;
|
||||||
pp.push_back(p);
|
p.points.push_back(p.points.front());
|
||||||
|
p.points = MultiPoint::_douglas_peucker(p.points, tolerance);
|
||||||
|
p.points.pop_back();
|
||||||
|
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);
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
|
|
||||||
%}
|
%}
|
||||||
|
Loading…
Reference in New Issue
Block a user