void addLineInfill(Polygons& result, PointMatrix matrix, int scanline_min_idx, int lineSpacing, AABB boundary, std::vector<std::vector<int64_t> > cutList, int extrusionWidth) { auto addLine = [&](Point from, Point to) { PolygonRef p = result.newPoly(); p.add(matrix.unapply(from)); p.add(matrix.unapply(to)); }; auto compare_int64_t = [](const void* a, const void* b) { int64_t n = (*(int64_t*)a) - (*(int64_t*)b); if (n < 0) return -1; if (n > 0) return 1; return 0; }; int scanline_idx = 0; for(int64_t x = scanline_min_idx * lineSpacing; x < boundary.max.X; x += lineSpacing) { qsort(cutList[scanline_idx].data(), cutList[scanline_idx].size(), sizeof(int64_t), compare_int64_t); for(unsigned int i = 0; i + 1 < cutList[scanline_idx].size(); i+=2) { if (cutList[scanline_idx][i+1] - cutList[scanline_idx][i] < extrusionWidth / 5) continue; addLine(Point(x, cutList[scanline_idx][i]), Point(x, cutList[scanline_idx][i+1])); } scanline_idx += 1; } }
void Infill::addLineInfill(Polygons& result, const PointMatrix& rotation_matrix, const int scanline_min_idx, const int line_distance, const AABB boundary, std::vector<std::vector<int64_t>>& cut_list, int64_t shift) { auto compare_int64_t = [](const void* a, const void* b) { int64_t n = (*(int64_t*)a) - (*(int64_t*)b); if (n < 0) { return -1; } if (n > 0) { return 1; } return 0; }; int scanline_idx = 0; for(int64_t x = scanline_min_idx * line_distance + shift; x < boundary.max.X; x += line_distance) { std::vector<int64_t>& crossings = cut_list[scanline_idx]; qsort(crossings.data(), crossings.size(), sizeof(int64_t), compare_int64_t); for(unsigned int crossing_idx = 0; crossing_idx + 1 < crossings.size(); crossing_idx += 2) { if (crossings[crossing_idx + 1] - crossings[crossing_idx] < infill_line_width / 5) { // segment is too short to create infill continue; } result.addLine(rotation_matrix.unapply(Point(x, crossings[crossing_idx])), rotation_matrix.unapply(Point(x, crossings[crossing_idx + 1]))); } scanline_idx += 1; } }