void Layer::MakeShells(uint shellcount, double extrudedWidth, double shelloffset, bool makeskirt, double infilloverlap) { double distance = 0.5 * extrudedWidth; double cleandist = min(extrudedWidth/4., thickness/3.); vector<Poly> shrinked = Clipping::getOffset(polygons,-distance-shelloffset); for (uint i = 0; i<shrinked.size(); i++) shrinked[i].cleanup(cleandist); //vector<Poly> shrinked = Clipping::getShrinkedCapped(polygons,distance); // outmost shells if (shellcount > 0) { if (skins>1) { // either skins for (uint i = 0; i<shrinked.size(); i++) { shrinked[i].setExtrusionFactor(1./skins); } skinPolygons = shrinked; } else { // or normal shell clearpolys(shellPolygons); shellPolygons.push_back(shrinked); } // inner shells distance = extrudedWidth; for (uint i = 1; i<shellcount; i++) // shrink from shell to shell { shrinked = Clipping::getOffset(shrinked,-distance); for (uint i = 0; i<shrinked.size(); i++) shrinked[i].cleanup(cleandist); //shrinked = Clipping::getShrinkedCapped(shrinked,distance); shellPolygons.push_back(shrinked); } } // the filling polygon fillPolygons = Clipping::getOffset(shrinked,-(1.-infilloverlap)*distance); for (uint i = 0; i<fillPolygons.size(); i++) fillPolygons[i].cleanup(cleandist); //fillPolygons = Clipping::getShrinkedCapped(shrinked,distance); //cerr << LayerNo << " > " << fillPolygons.size()<< endl; calcConvexHull(); if (makeskirt) { MakeSkirt(3*distance); // skirt distance = 3 * shell distance } //cerr << " .. made " << fillPolygons.size() << " offsetpolys " << endl; // for (uint i =0; i<shellPolygons.size(); i++) { // cout << "shell " << i << endl; // for (uint j =1; j<shellPolygons[i].size(); j++) { // shellPolygons[i][j].printinfo(); // } // } }
ofPolyline convexHull(ofPolyline & line){ vector < hPoint > ptsIn; for (int i = 0; i < line.getVertices().size(); i++){ hPoint pt; pt.x = line.getVertices()[i].x; pt.y = line.getVertices()[i].y; ptsIn.push_back(pt); } vector < hPoint > ptsOut; ptsOut = calcConvexHull(ptsIn); ofPolyline out; for (int i = 0; i < ptsOut.size(); i++){ out.addVertex(ofPoint(ptsOut[i].x, ptsOut[i].y)); } return out; }
void Layer::MakeShells(const Settings &settings) { double extrudedWidth = settings.GetExtrudedMaterialWidth(thickness); double roundline_extrfactor = settings.RoundedLinewidthCorrection(extrudedWidth,thickness); double distance = 0.5 * extrudedWidth; double cleandist = min(distance/CLEANFACTOR, thickness/CLEANFACTOR); double shelloffset = settings.get_double("Slicing","ShellOffset"); uint shellcount = settings.get_integer("Slicing","ShellCount"); double infilloverlap = settings.get_double("Slicing","InfillOverlap"); // first shrink with global offset vector<Poly> shrinked = Clipping::getOffset(polygons, -2.0/M_PI*extrudedWidth-shelloffset); vector<Poly> thickPolygons; FindThinpolys(shrinked, extrudedWidth, thickPolygons, thinPolygons); shrinked = thickPolygons; for (uint i = 0; i<thinPolygons.size(); i++) thinPolygons[i].cleanup(cleandist); // // expand shrinked to get to the outer shell again // shrinked = Clipping::getOffset(shrinked, 2*distance); for (uint i = 0; i<shrinked.size(); i++) shrinked[i].cleanup(cleandist); //vector<Poly> shrinked = Clipping::getShrinkedCapped(polygons,distance); // outmost shells if (shellcount > 0) { if (skins>1) { // either skins for (uint i = 0; i<shrinked.size(); i++) { shrinked[i].setExtrusionFactor(1./skins*roundline_extrfactor); } skinPolygons = shrinked; } else { // or normal shell clearpolys(shellPolygons); for (uint i = 0; i<shrinked.size(); i++) { shrinked[i].setExtrusionFactor(roundline_extrfactor); } shellPolygons.push_back(shrinked); } // inner shells for (uint i = 1; i<shellcount; i++) // shrink from shell to shell { shrinked = Clipping::getOffset(shrinked,-extrudedWidth); vector<Poly> thinpolys; FindThinpolys(shrinked, extrudedWidth, thickPolygons, thinpolys); shrinked = thickPolygons; thinPolygons.insert(thinPolygons.end(), thinpolys.begin(),thinpolys.end()); for (uint j = 0; j<shrinked.size(); j++) shrinked[j].cleanup(cleandist); //shrinked = Clipping::getShrinkedCapped(shrinked,extrudedWidth); shellPolygons.push_back(shrinked); } } // the filling polygon if (settings.get_boolean("Slicing","DoInfill")) { fillPolygons = Clipping::getOffset(shrinked,-(1.-infilloverlap)*extrudedWidth); for (uint i = 0; i<fillPolygons.size(); i++) fillPolygons[i].cleanup(cleandist); //fillPolygons = Clipping::getShrinkedCapped(shrinked,extrudedWidth); //cerr << LayerNo << " > " << fillPolygons.size()<< endl; } calcConvexHull(); //cerr << " .. made " << fillPolygons.size() << " offsetpolys " << endl; // for (uint i =0; i<shellPolygons.size(); i++) { // cout << "shell " << i << endl; // for (uint j =1; j<shellPolygons[i].size(); j++) { // shellPolygons[i][j].printinfo(); // } // } }
PolyLine2f calcConvexHull( const std::vector<Vec2f> &points ) { return calcConvexHull( &points[0], points.size() ); }