2013-10-31 08:45:00 +04:00
|
|
|
#include "clipper-utils.h"
|
|
|
|
#include <boost/foreach.hpp>
|
|
|
|
|
|
|
|
namespace ClipperUtils {
|
|
|
|
|
2013-12-02 02:33:40 +04:00
|
|
|
ClipperLib::Polygon fromOutline2d(const Outline2d &outline) {
|
|
|
|
ClipperLib::Polygon p;
|
|
|
|
BOOST_FOREACH(const Vector2d &v, outline) {
|
|
|
|
p.push_back(ClipperLib::IntPoint(v[0]*CLIPPER_SCALE, v[1]*CLIPPER_SCALE));
|
|
|
|
}
|
|
|
|
// Make sure all polygons point up, since we project also
|
|
|
|
// back-facing polygon in PolysetUtils::project()
|
|
|
|
if (!ClipperLib::Orientation(p)) std::reverse(p.begin(), p.end());
|
|
|
|
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
2013-11-25 09:28:26 +04:00
|
|
|
ClipperLib::Polygons fromPolygon2d(const Polygon2d &poly) {
|
2013-10-31 08:45:00 +04:00
|
|
|
ClipperLib::Polygons result;
|
|
|
|
BOOST_FOREACH(const Outline2d &outline, poly.outlines()) {
|
2013-12-02 02:33:40 +04:00
|
|
|
result.push_back(fromOutline2d(outline));
|
2013-10-31 08:45:00 +04:00
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
Polygon2d *toPolygon2d(const ClipperLib::Polygons &poly) {
|
|
|
|
Polygon2d *result = new Polygon2d;
|
|
|
|
BOOST_FOREACH(const ClipperLib::Polygon &p, poly) {
|
|
|
|
Outline2d outline;
|
2013-11-26 10:31:55 +04:00
|
|
|
const Vector2d *lastv = NULL;
|
2013-10-31 08:45:00 +04:00
|
|
|
BOOST_FOREACH(const ClipperLib::IntPoint &ip, p) {
|
2013-11-26 10:31:55 +04:00
|
|
|
Vector2d v(1.0*ip.X/CLIPPER_SCALE, 1.0*ip.Y/CLIPPER_SCALE);
|
|
|
|
// Ignore too close vertices. This is to be nice to subsequent processes.
|
|
|
|
if (lastv && (v-*lastv).squaredNorm() < 0.001) continue;
|
|
|
|
outline.push_back(v);
|
|
|
|
lastv = &outline.back();
|
2013-10-31 08:45:00 +04:00
|
|
|
}
|
|
|
|
result->addOutline(outline);
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2013-11-25 09:28:26 +04:00
|
|
|
ClipperLib::Polygons process(const ClipperLib::Polygons &polygons,
|
|
|
|
ClipperLib::ClipType cliptype,
|
|
|
|
ClipperLib::PolyFillType polytype)
|
|
|
|
{
|
|
|
|
ClipperLib::Polygons result;
|
|
|
|
ClipperLib::Clipper clipper;
|
|
|
|
clipper.AddPolygons(polygons, ClipperLib::ptSubject);
|
|
|
|
clipper.Execute(cliptype, result, polytype);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2013-10-31 08:45:00 +04:00
|
|
|
};
|