reduce wavy seams for all layer heights, improve painting
This commit is contained in:
parent
06084b0bc5
commit
0479387b20
@ -1379,23 +1379,31 @@ void SeamPlacer::align_seam_points(const PrintObject *po, const SeamPlacerImpl::
|
|||||||
float sharp_angle_weight = angle_weight(SeamPlacer::sharp_angle_snapping_threshold);
|
float sharp_angle_weight = angle_weight(SeamPlacer::sharp_angle_snapping_threshold);
|
||||||
|
|
||||||
//gather points positions and weights
|
//gather points positions and weights
|
||||||
size_t segments_count = 0;
|
float total_length = 0.0f;
|
||||||
|
float sharp_length = 0.0f;
|
||||||
|
Vec3f prev_pos = layers[seam_string[0].first].points[seam_string[0].second].position;
|
||||||
for (size_t index = 0; index < seam_string.size(); ++index) {
|
for (size_t index = 0; index < seam_string.size(); ++index) {
|
||||||
const SeamCandidate &point = layers[seam_string[index].first].points[seam_string[index].second];
|
const SeamCandidate &point = layers[seam_string[index].first].points[seam_string[index].second];
|
||||||
Vec3f pos = point.position;
|
Vec3f pos = point.position;
|
||||||
|
float dist = (pos - prev_pos).norm();
|
||||||
|
total_length += dist;
|
||||||
observations[index] = pos.head<2>();
|
observations[index] = pos.head<2>();
|
||||||
observation_points[index] = pos.z();
|
observation_points[index] = pos.z();
|
||||||
weights[index] = angle_weight(point.local_ccw_angle);
|
weights[index] = angle_weight(point.local_ccw_angle);
|
||||||
bool is_enforced = point.type == EnforcedBlockedSeamPoint::Enforced;
|
bool is_enforced = point.type == EnforcedBlockedSeamPoint::Enforced;
|
||||||
if (is_enforced || weights[index] > sharp_angle_weight) {
|
if (is_enforced) {
|
||||||
segments_count++;
|
weights[index] = std::max(weights[index], 6.0f);
|
||||||
}
|
}
|
||||||
|
if (is_enforced || weights[index] > sharp_angle_weight) {
|
||||||
|
sharp_length+= dist;
|
||||||
|
}
|
||||||
|
prev_pos = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Curve Fitting
|
// Curve Fitting
|
||||||
size_t number_of_segments = std::max(
|
size_t number_of_segments = std::max(
|
||||||
std::max(size_t(1), seam_string.size() / 200),
|
std::max(size_t(1), size_t(total_length / 30.0f)),
|
||||||
size_t(segments_count / SeamPlacer::seam_align_seams_per_segment));
|
size_t(sharp_length / SeamPlacer::seam_align_mm_per_segment));
|
||||||
auto curve = Geometry::fit_cubic_bspline(observations, observation_points, weights, number_of_segments);
|
auto curve = Geometry::fit_cubic_bspline(observations, observation_points, weights, number_of_segments);
|
||||||
|
|
||||||
// Do alignment - compute fitted point for each point in the string from its Z coord, and store the position into
|
// Do alignment - compute fitted point for each point in the string from its Z coord, and store the position into
|
||||||
|
@ -147,8 +147,8 @@ public:
|
|||||||
static constexpr float seam_align_tolerable_dist_factor = 4.0f;
|
static constexpr float seam_align_tolerable_dist_factor = 4.0f;
|
||||||
// minimum number of seams needed in cluster to make alignment happen
|
// minimum number of seams needed in cluster to make alignment happen
|
||||||
static constexpr size_t seam_align_minimum_string_seams = 6;
|
static constexpr size_t seam_align_minimum_string_seams = 6;
|
||||||
// number of seams per bspline segment
|
// millimeters covered by spline; determines number of splines for the given string
|
||||||
static constexpr float seam_align_seams_per_segment = 8.0f;
|
static constexpr size_t seam_align_mm_per_segment = 4.0f;
|
||||||
|
|
||||||
//The following data structures hold all perimeter points for all PrintObject.
|
//The following data structures hold all perimeter points for all PrintObject.
|
||||||
std::unordered_map<const PrintObject*, PrintObjectSeamData> m_seam_per_object;
|
std::unordered_map<const PrintObject*, PrintObjectSeamData> m_seam_per_object;
|
||||||
|
Loading…
Reference in New Issue
Block a user