diff --git a/src/libslic3r/Polyline.cpp b/src/libslic3r/Polyline.cpp index d805473b58e..5743e38bd5b 100644 --- a/src/libslic3r/Polyline.cpp +++ b/src/libslic3r/Polyline.cpp @@ -267,29 +267,34 @@ ThickLines ThickPolyline::thicklines() const // Removes the given distance from the end of the ThickPolyline void ThickPolyline::clip_end(double distance) { - while (distance > 0) { - Vec2d last_point = this->last_point().cast(); - coordf_t last_width = this->width.back(); - this->points.pop_back(); - this->width.pop_back(); - if (this->points.empty()) - break; - - Vec2d vec = this->last_point().cast() - last_point; - coordf_t width_diff = this->width.back() - last_width; - double vec_length_sqr = vec.squaredNorm(); - if (vec_length_sqr > distance * distance) { - double t = (distance / std::sqrt(vec_length_sqr)); - this->points.emplace_back((last_point + vec * t).cast()); - this->width.emplace_back(last_width + width_diff * t); - assert(this->width.size() == (this->points.size() - 1) * 2); - return; - } else + if (! this->empty()) { + assert(this->width.size() == (this->points.size() - 1) * 2); + while (distance > 0) { + Vec2d last_point = this->last_point().cast(); + this->points.pop_back(); + if (this->points.empty()) { + assert(this->width.empty()); + break; + } + coordf_t last_width = this->width.back(); this->width.pop_back(); - distance -= std::sqrt(vec_length_sqr); + Vec2d vec = this->last_point().cast() - last_point; + coordf_t width_diff = this->width.back() - last_width; + double vec_length_sqr = vec.squaredNorm(); + if (vec_length_sqr > distance * distance) { + double t = (distance / std::sqrt(vec_length_sqr)); + this->points.emplace_back((last_point + vec * t).cast()); + this->width.emplace_back(last_width + width_diff * t); + assert(this->width.size() == (this->points.size() - 1) * 2); + return; + } else + this->width.pop_back(); + + distance -= std::sqrt(vec_length_sqr); + } } - assert(this->width.size() == (this->points.size() - 1) * 2); + assert(this->points.empty() ? this->width.empty() : this->width.size() == (this->points.size() - 1) * 2); } void ThickPolyline::start_at_index(int index) diff --git a/src/libslic3r/Polyline.hpp b/src/libslic3r/Polyline.hpp index 8e362f03719..1b23388e184 100644 --- a/src/libslic3r/Polyline.hpp +++ b/src/libslic3r/Polyline.hpp @@ -187,6 +187,7 @@ struct ThickPolyline { const Point& last_point() const { return this->points.back(); } size_t size() const { return this->points.size(); } bool is_valid() const { return this->points.size() >= 2; } + bool empty() const { return this->points.empty(); } double length() const { return Slic3r::length(this->points); } void clear() { this->points.clear(); this->width.clear(); }