// Follow an Archimedean spiral, in polar coordinates: r=a+b\theta Pointfs FillArchimedeanChords::_generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y) { // Radius to achieve. coordf_t rmax = std::sqrt(coordf_t(max_x)*coordf_t(max_x)+coordf_t(max_y)*coordf_t(max_y)) * std::sqrt(2.) + 1.5; // Now unwind the spiral. coordf_t a = 1.; coordf_t b = 1./(2.*M_PI); coordf_t theta = 0.; coordf_t r = 1; Pointfs out; //FIXME Vojtech: If used as a solid infill, there is a gap left at the center. out.push_back(Pointf(0, 0)); out.push_back(Pointf(1, 0)); while (r < rmax) { theta += 1. / r; r = a + b * theta; out.push_back(Pointf(r * cos(theta), r * sin(theta))); } return out; }
Pointfs FillHilbertCurve::_generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y) { // Minimum power of two square to fit the domain. size_t sz = 2; size_t pw = 1; { size_t sz0 = std::max(max_x + 1 - min_x, max_y + 1 - min_y); while (sz < sz0) { sz = sz << 1; ++ pw; } } size_t sz2 = sz * sz; Pointfs line; line.reserve(sz2); for (size_t i = 0; i < sz2; ++ i) { Point p = hilbert_n_to_xy(i); line.push_back(Pointf(p.x + min_x, p.y + min_y)); } return line; }
Pointfs FillOctagramSpiral::_generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y) { // Radius to achieve. coordf_t rmax = std::sqrt(coordf_t(max_x)*coordf_t(max_x)+coordf_t(max_y)*coordf_t(max_y)) * std::sqrt(2.) + 1.5; // Now unwind the spiral. coordf_t r = 0; coordf_t r_inc = sqrt(2.); Pointfs out; out.push_back(Pointf(0, 0)); while (r < rmax) { r += r_inc; coordf_t rx = r / sqrt(2.); coordf_t r2 = r + rx; out.push_back(Pointf( r, 0.)); out.push_back(Pointf( r2, rx)); out.push_back(Pointf( rx, rx)); out.push_back(Pointf( rx, r2)); out.push_back(Pointf(0., r)); out.push_back(Pointf(-rx, r2)); out.push_back(Pointf(-rx, rx)); out.push_back(Pointf(-r2, rx)); out.push_back(Pointf(-r, 0.)); out.push_back(Pointf(-r2, -rx)); out.push_back(Pointf(-rx, -rx)); out.push_back(Pointf(-rx, -r2)); out.push_back(Pointf(0., -r)); out.push_back(Pointf( rx, -r2)); out.push_back(Pointf( rx, -rx)); out.push_back(Pointf( r2+r_inc, -rx)); } return out; }