// first goes in then out to get capped corners vector<Poly> Clipping::getShrinkedCapped(const vector<Poly> &polys, double distance, JoinType jtype, double miterdist) { CL::Polygons cpolys = getClipperPolygons(polys); CL::Polygons offset1 = CLOffset(cpolys, -2*CL_FACTOR*distance, CLType(jtype), 0);// CL::jtRound); CL::Polygons offset = CLOffset(offset1, 1*CL_FACTOR*distance, CLType(jtype), 0); double z=0, extrf=1.;; if (polys.size()>0) { z= polys.back().getZ(); extrf = polys.back().getExtrusionFactor(); } return getPolys(offset,z,extrf); }
// overlap a bit and unite to merge adjacent polys CL::Polygons Clipping::getMerged(const CL::Polygons &cpolys, int overlap) { CL::Clipper clpr; // return polys; // make wider to get overlap CL::Polygons offset; offset = CLOffset(cpolys, overlap, CL::jtMiter, 1); //CL::OffsetPolygons(cpolys, offset, 10, ClipperLib::jtMiter, 1); // return getPolys(offset, polys.back().getZ(),polys.back().getExtrusionFactor()); clpr.AddPolygons(offset, CL::ptSubject); CL::Polygons cpolys3; clpr.Execute(CL::ctUnion, cpolys3, CL::pftEvenOdd, CL::pftEvenOdd); //cerr << cpolys3.size() << " - "<<offset.size() << endl; // shrink the result return CLOffset(cpolys3, -overlap, CL::jtMiter, 1); }
vector<Poly> Clipping::getOffset(const Poly &poly, double distance, JoinType jtype, double miterdist) { CL::Polygons cpolys(1); cpolys[0]=getClipperPolygon(poly); CL::Polygons offset = CLOffset(cpolys, CL_FACTOR*distance, CLType(jtype), miterdist); return getPolys(offset, poly.getZ(), poly.getExtrusionFactor()); }
vector<Poly> Clipping::getOffset(const vector<Poly> &polys, double distance, JoinType jtype, double miterdist) { CL::Paths cpolys = getClipperPolygons(polys); CL::Paths offset = CLOffset(cpolys, CL_FACTOR*distance, CLType(jtype), miterdist); double z=0, extrf=1.;; if (polys.size()>0) { z = polys.back().getZ(); extrf = polys.back().getExtrusionFactor(); } return getPolys(offset,z,extrf); }