250 {
251 float speed_base = ext_perimeter_speed > 0 ? ext_perimeter_speed : original_speed;
252 std::map<float, float> speed_sections;
253 for (size_t i = 0; i < overhangs_w_speeds.size(); i++) {
254 float distance = path.width * (1.0 - (overhangs_w_speeds[i].first / 100.0));
255 float speed = overhangs_w_speeds[i].second.percent ? (speed_base * overhangs_w_speeds[i].second.value / 100.0) :
256 overhangs_w_speeds[i].second.value;
257 if (speed <
EPSILON) speed = speed_base;
259 }
260
261 std::map<float, float> fan_speed_sections;
262 for (size_t i = 0; i < overhangs_w_fan_speeds.size(); i++) {
263 float distance = path.width * (1.0 - (overhangs_w_fan_speeds[i].first / 100.0));
264 float fan_speed = overhangs_w_fan_speeds[i].second.get_at(extruder_id);
265 fan_speed_sections[
distance] = fan_speed;
266 }
267
268 std::vector<ExtendedPoint> extended_points =
270
271 std::vector<ProcessedPoint> processed_points;
272 processed_points.reserve(extended_points.size());
273 for (size_t i = 0; i < extended_points.size(); i++) {
274 const ExtendedPoint &curr = extended_points[i];
275 const ExtendedPoint &next = extended_points[i + 1 < extended_points.size() ? i + 1 : i];
276
277
278 float artificial_distance_to_curled_lines = 0.0;
279 const double dist_limit = 10.0 * path.width;
280 {
281 Vec2d middle = 0.5 * (curr.position + next.position);
283 if (!line_indices.empty()) {
284 double len = (next.position - curr.position).norm();
285
286
287
288
289 if (len > 8) {
290 Vec2d dir =
Vec2d(next.position - curr.position) / len;
292
298 };
299
300 double projected_lengths_sum = 0;
301 for (size_t idx : line_indices) {
305 continue;
307 projected_lengths_sum += projected_length;
308 }
309 if (projected_lengths_sum < 0.4 * len) {
310 line_indices.clear();
311 }
312 }
313
314 for (size_t idx : line_indices) {
317 float dist = path.width * (1.0 - (distance_from_curled / dist_limit)) *
318 (1.0 - (distance_from_curled / dist_limit)) *
319 (line.curled_height / (path.height * 10.0f));
320 artificial_distance_to_curled_lines = std::max(artificial_distance_to_curled_lines, dist);
321 }
322 }
323 }
324
325 auto interpolate_speed = [](
const std::map<float, float> &values,
float distance) {
326 auto upper_dist = values.lower_bound(distance);
327 if (upper_dist == values.end()) {
328 return values.rbegin()->second;
329 }
330 if (upper_dist == values.begin()) {
331 return upper_dist->second;
332 }
333
334 auto lower_dist = std::prev(upper_dist);
335 float t = (
distance - lower_dist->first) / (upper_dist->first - lower_dist->first);
336 return (1.0f - t) * lower_dist->second + t * upper_dist->second;
337 };
338
339 float extrusion_speed = std::min(interpolate_speed(speed_sections, curr.distance),
340 interpolate_speed(speed_sections, next.distance));
341 float curled_base_speed = interpolate_speed(speed_sections, artificial_distance_to_curled_lines);
342 float final_speed = std::min(curled_base_speed, extrusion_speed);
343 float fan_speed = std::min(interpolate_speed(fan_speed_sections, curr.distance),
344 interpolate_speed(fan_speed_sections, next.distance));
345
346 processed_points.push_back({
scaled(curr.position), final_speed, int(fan_speed)});
347 }
348 return processed_points;
349 }
std::unordered_map< const PrintObject *, AABBTreeLines::LinesDistancer< CurledLine > > prev_curled_extrusions
Definition ExtrusionProcessor.hpp:225
const PrintObject * current_object
Definition ExtrusionProcessor.hpp:227
std::unordered_map< const PrintObject *, AABBTreeLines::LinesDistancer< Linef > > prev_layer_boundaries
Definition ExtrusionProcessor.hpp:223
#define scale_(val)
Definition libslic3r.h:69
static constexpr double EPSILON
Definition libslic3r.h:51
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half abs(const half &a)
Definition Half.h:445
bool inside(const Polygons &polygons, const Point &p)
T dist(const boost::polygon::point_data< T > &p1, const boost::polygon::point_data< T > &p2)
Definition Geometry.cpp:280
double distance_to(const L &line, const Vec< Dim< L >, Scalar< L > > &point)
Definition Line.hpp:82
std::vector< Line > Lines
Definition Line.hpp:17
Slic3r::Lines intersection_ln(const Slic3r::Lines &subject, const Slic3r::Polygons &clip)
Definition ClipperUtils.hpp:482
BoundingBox scaled(const BoundingBoxf &bb)
Definition BoundingBox.hpp:240
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > Vec2d
Definition Point.hpp:51
constexpr Eigen::Matrix< Tout, 2, EigenArgs... > unscaled(const Slic3r::ClipperLib::IntPoint &v) noexcept
Definition Arrange.cpp:55
double distance(const P &p1, const P &p2)
Definition geometry_traits.hpp:329
Slic3r::Polygon Polygon
Definition Emboss.cpp:34