Exemple #1
0
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;
    
}
Exemple #3
0
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();
  //   }
  // }
}
Exemple #4
0
PolyLine2f calcConvexHull( const std::vector<Vec2f> &points )
{
    return calcConvexHull( &points[0], points.size() );
}