mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-08-14 18:15:53 +08:00
Fix 'merge thin walls with perimeter' (unneeded travels)
also now use coincide_with_epsilon for most of medial_axis, as I have the proof the position can vary by 1 unit in an intersection. supermerill/SuperSlicer#2092
This commit is contained in:
parent
2f4b55ed3c
commit
91d3862ead
@ -465,7 +465,7 @@ get_coeff_from_angle_countour(Point &point, const ExPolygon &contour, coord_t mi
|
||||
if (angle >= PI) angle = 2 * PI - angle; // smaller angle
|
||||
//compute the diff from 90°
|
||||
angle = abs(angle - PI / 2);
|
||||
if (point_near.coincides_with(point_nearest) && std::max(nearest_dist, near_dist) + SCALED_EPSILON < point_nearest.distance_to(point_near)) {
|
||||
if (point_near.coincides_with_epsilon(point_nearest) && std::max(nearest_dist, near_dist) + SCALED_EPSILON < point_nearest.distance_to(point_near)) {
|
||||
//not only nearest
|
||||
Point point_before = id_near == 0 ? contour.contour.points.back() : contour.contour.points[id_near - 1];
|
||||
Point point_after = id_near == contour.contour.points.size() - 1 ? contour.contour.points.front() : contour.contour.points[id_near + 1];
|
||||
@ -532,13 +532,13 @@ MedialAxis::fusion_curve(ThickPolylines &pp)
|
||||
for (size_t j = 0; j < pp.size(); ++j) {
|
||||
if (j == i) continue;
|
||||
ThickPolyline& other = pp[j];
|
||||
if (polyline.first_point().coincides_with(other.last_point())) {
|
||||
if (polyline.first_point().coincides_with_epsilon(other.last_point())) {
|
||||
other.reverse();
|
||||
crosspoint.push_back(j);
|
||||
double dot_temp = dot(Line(polyline.points[0], polyline.points[1]), (Line(other.points[0], other.points[1])));
|
||||
min_dot = std::min(min_dot, abs(dot_temp));
|
||||
sum_dot += dot_temp;
|
||||
} else if (polyline.first_point().coincides_with(other.first_point())) {
|
||||
} else if (polyline.first_point().coincides_with_epsilon(other.first_point())) {
|
||||
crosspoint.push_back(j);
|
||||
double dot_temp = dot(Line(polyline.points[0], polyline.points[1]), (Line(other.points[0], other.points[1])));
|
||||
min_dot = std::min(min_dot, abs(dot_temp));
|
||||
@ -616,10 +616,10 @@ MedialAxis::remove_bits(ThickPolylines &pp)
|
||||
for (size_t j = 0; j < pp.size(); ++j) {
|
||||
if (j == i) continue;
|
||||
ThickPolyline& other = pp[j];
|
||||
if (polyline.first_point().coincides_with(other.last_point())) {
|
||||
if (polyline.first_point().coincides_with_epsilon(other.last_point())) {
|
||||
other.reverse();
|
||||
crosspoint.push_back(j);
|
||||
} else if (polyline.first_point().coincides_with(other.first_point())) {
|
||||
} else if (polyline.first_point().coincides_with_epsilon(other.first_point())) {
|
||||
crosspoint.push_back(j);
|
||||
}
|
||||
}
|
||||
@ -675,10 +675,10 @@ MedialAxis::fusion_corners(ThickPolylines &pp)
|
||||
for (size_t j = 0; j < pp.size(); ++j) {
|
||||
if (j == i) continue;
|
||||
ThickPolyline& other = pp[j];
|
||||
if (polyline.first_point().coincides_with(other.last_point())) {
|
||||
if (polyline.first_point().coincides_with_epsilon(other.last_point())) {
|
||||
other.reverse();
|
||||
crosspoint.push_back(j);
|
||||
} else if (polyline.first_point().coincides_with(other.first_point())) {
|
||||
} else if (polyline.first_point().coincides_with_epsilon(other.first_point())) {
|
||||
crosspoint.push_back(j);
|
||||
}
|
||||
}
|
||||
@ -912,13 +912,13 @@ MedialAxis::main_fusion(ThickPolylines& pp)
|
||||
// find another polyline starting here
|
||||
for (size_t j = i + 1; j < pp.size(); ++j) {
|
||||
ThickPolyline& other = pp[j];
|
||||
if (polyline.last_point().coincides_with(other.last_point())) {
|
||||
if (polyline.last_point().coincides_with_epsilon(other.last_point())) {
|
||||
polyline.reverse();
|
||||
other.reverse();
|
||||
} else if (polyline.first_point().coincides_with(other.last_point())) {
|
||||
} else if (polyline.first_point().coincides_with_epsilon(other.last_point())) {
|
||||
other.reverse();
|
||||
} else if (polyline.first_point().coincides_with(other.first_point())) {
|
||||
} else if (polyline.last_point().coincides_with(other.first_point())) {
|
||||
} else if (polyline.first_point().coincides_with_epsilon(other.first_point())) {
|
||||
} else if (polyline.last_point().coincides_with_epsilon(other.first_point())) {
|
||||
polyline.reverse();
|
||||
} else {
|
||||
continue;
|
||||
@ -978,7 +978,7 @@ MedialAxis::main_fusion(ThickPolylines& pp)
|
||||
//std::cout << "try to find main : " << k << " ? " << i << " " << j << " ";
|
||||
if (k == i || k == j) continue;
|
||||
ThickPolyline& main = pp[k];
|
||||
if (polyline.first_point().coincides_with(main.last_point())) {
|
||||
if (polyline.first_point().coincides_with_epsilon(main.last_point())) {
|
||||
main.reverse();
|
||||
if (!main.endpoints.second)
|
||||
find_main_branch = true;
|
||||
@ -986,7 +986,7 @@ MedialAxis::main_fusion(ThickPolylines& pp)
|
||||
biggest_main_branch_id = k;
|
||||
biggest_main_branch_length = (coord_t)main.length();
|
||||
}
|
||||
} else if (polyline.first_point().coincides_with(main.first_point())) {
|
||||
} else if (polyline.first_point().coincides_with_epsilon(main.first_point())) {
|
||||
if (!main.endpoints.second)
|
||||
find_main_branch = true;
|
||||
else if (biggest_main_branch_length < main.length()) {
|
||||
@ -1291,14 +1291,14 @@ MedialAxis::concatenate_polylines_with_crossing(ThickPolylines& pp)
|
||||
if (other.endpoints.first && other.endpoints.second) continue;
|
||||
bool me_reverse = false;
|
||||
bool other_reverse = false;
|
||||
if (polyline.last_point().coincides_with(other.last_point())) {
|
||||
if (polyline.last_point().coincides_with_epsilon(other.last_point())) {
|
||||
other_reverse = true;
|
||||
} else if (polyline.first_point().coincides_with(other.last_point())) {
|
||||
} else if (polyline.first_point().coincides_with_epsilon(other.last_point())) {
|
||||
me_reverse = true;
|
||||
other_reverse = true;
|
||||
} else if (polyline.first_point().coincides_with(other.first_point())) {
|
||||
} else if (polyline.first_point().coincides_with_epsilon(other.first_point())) {
|
||||
me_reverse = true;
|
||||
} else if (!polyline.last_point().coincides_with(other.first_point())) {
|
||||
} else if (!polyline.last_point().coincides_with_epsilon(other.first_point())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1316,12 +1316,12 @@ MedialAxis::concatenate_polylines_with_crossing(ThickPolylines& pp)
|
||||
}
|
||||
}
|
||||
if (best_candidate != nullptr && best_candidate->points.size() > 1) {
|
||||
if (polyline.last_point().coincides_with(best_candidate->last_point())) {
|
||||
if (polyline.last_point().coincides_with_epsilon(best_candidate->last_point())) {
|
||||
best_candidate->reverse();
|
||||
} else if (polyline.first_point().coincides_with(best_candidate->last_point())) {
|
||||
} else if (polyline.first_point().coincides_with_epsilon(best_candidate->last_point())) {
|
||||
polyline.reverse();
|
||||
best_candidate->reverse();
|
||||
} else if (polyline.first_point().coincides_with(best_candidate->first_point())) {
|
||||
} else if (polyline.first_point().coincides_with_epsilon(best_candidate->first_point())) {
|
||||
polyline.reverse();
|
||||
}
|
||||
//intersections may create over-extrusion because the included circle can be a bit larger. We have to make it short again if needed.
|
||||
@ -1415,18 +1415,18 @@ MedialAxis::remove_too_short_polylines(ThickPolylines& pp, const coord_t min_siz
|
||||
// if (endpoint_not_used[idx_endpoint]) {
|
||||
// int nb_endpoints;
|
||||
// Point pt = idx_endpoint % 2 == 0 ? polyline.first_point() : polyline.last_point();
|
||||
// if (idx_endpoint % 2 == 0 && pt.coincides_with(polyline.last_point())) {
|
||||
// if (idx_endpoint % 2 == 0 && pt.coincides_with_epsilon(polyline.last_point())) {
|
||||
// nb_endpoints++;
|
||||
// endpoint_not_used[(idx_endpoint / 2) + 1] = false;
|
||||
// }
|
||||
// //good, now find other points
|
||||
// for (size_t idx_other_pp = (idx_endpoint / 2) + 1; idx_other_pp < pp.size(); idx_other_pp++) {
|
||||
// ThickPolyline& other = pp[idx_other_pp];
|
||||
// if (pt.coincides_with(other.first_point())) {
|
||||
// if (pt.coincides_with_epsilon(other.first_point())) {
|
||||
// nb_endpoints++;
|
||||
// endpoint_not_used[idx_other_pp * 2] = false;
|
||||
// }
|
||||
// if (pt.coincides_with(other.last_point())) {
|
||||
// if (pt.coincides_with_epsilon(other.last_point())) {
|
||||
// nb_endpoints++;
|
||||
// endpoint_not_used[idx_other_pp * 2 + 1] = false;
|
||||
// }
|
||||
@ -1438,7 +1438,7 @@ MedialAxis::remove_too_short_polylines(ThickPolylines& pp, const coord_t min_siz
|
||||
// std::cout << "reduce " << reduction << " points!\n";
|
||||
// if (idx_endpoint % 2 == 0 ) {
|
||||
// polyline.width.front() *= reduction;
|
||||
// if(pt.coincides_with(polyline.last_point()))
|
||||
// if(pt.coincides_with_epsilon(polyline.last_point()))
|
||||
// polyline.width.back() *= reduction;
|
||||
// } else {
|
||||
// polyline.width.back() *= reduction;
|
||||
@ -1446,10 +1446,10 @@ MedialAxis::remove_too_short_polylines(ThickPolylines& pp, const coord_t min_siz
|
||||
// //good, now find other points
|
||||
// for (size_t idx_other_pp = (idx_endpoint / 2) + 1; idx_other_pp < pp.size(); idx_other_pp++) {
|
||||
// ThickPolyline& other = pp[idx_other_pp];
|
||||
// if (pt.coincides_with(other.first_point())) {
|
||||
// if (pt.coincides_with_epsilon(other.first_point())) {
|
||||
// other.width.front() *= reduction;
|
||||
// }
|
||||
// if (pt.coincides_with(other.last_point())) {
|
||||
// if (pt.coincides_with_epsilon(other.last_point())) {
|
||||
// other.width.back() *= reduction;
|
||||
// }
|
||||
// }
|
||||
@ -1697,7 +1697,7 @@ MedialAxis::build(ThickPolylines &polylines_out)
|
||||
{
|
||||
//static int id = 0;
|
||||
//id++;
|
||||
//std::cout << this->id << "\n";
|
||||
//std::cout << id << "\n";
|
||||
//{
|
||||
// std::stringstream stri;
|
||||
// stri << "medial_axis_0_enter_" << id << ".svg";
|
||||
@ -1710,8 +1710,8 @@ MedialAxis::build(ThickPolylines &polylines_out)
|
||||
// std::stringstream stri;
|
||||
// stri << "medial_axis_0.5_simplified_" << id << ".svg";
|
||||
// SVG svg(stri.str());
|
||||
// svg.draw(bounds);
|
||||
// svg.draw(this->expolygon);
|
||||
// svg.draw(*bounds, "grey");
|
||||
// svg.draw(this->expolygon, "green");
|
||||
// svg.Close();
|
||||
//}
|
||||
//safety check
|
||||
@ -1778,9 +1778,9 @@ MedialAxis::build(ThickPolylines &polylines_out)
|
||||
// std::stringstream stri;
|
||||
// stri << "medial_axis_0.9_voronoi_" << id << ".svg";
|
||||
// SVG svg(stri.str());
|
||||
// //svg.draw(bounds);
|
||||
// svg.draw(this->expolygon);
|
||||
// svg.draw(pp);
|
||||
// svg.draw(*bounds, "grey");
|
||||
// svg.draw(this->expolygon, "green");
|
||||
// svg.draw(pp, "red");
|
||||
// svg.Close();
|
||||
//}
|
||||
|
||||
@ -1805,9 +1805,9 @@ MedialAxis::build(ThickPolylines &polylines_out)
|
||||
// std::stringstream stri;
|
||||
// stri << "medial_axis_1_voronoi_" << id << ".svg";
|
||||
// SVG svg(stri.str());
|
||||
// svg.draw(*bounds);
|
||||
// svg.draw(this->expolygon);
|
||||
// svg.draw(pp);
|
||||
// svg.draw(*bounds, "grey");
|
||||
// svg.draw(this->expolygon, "green");
|
||||
// svg.draw(pp, "red");
|
||||
// svg.Close();
|
||||
//}
|
||||
|
||||
@ -1820,9 +1820,9 @@ MedialAxis::build(ThickPolylines &polylines_out)
|
||||
// std::stringstream stri;
|
||||
// stri << "medial_axis_1_voronoi_" << id << ".svg";
|
||||
// SVG svg(stri.str());
|
||||
// svg.draw(*bounds);
|
||||
// svg.draw(this->expolygon);
|
||||
// svg.draw(pp);
|
||||
// svg.draw(*bounds, "grey");
|
||||
// svg.draw(this->expolygon, "green");
|
||||
// svg.draw(pp, "red");
|
||||
// svg.Close();
|
||||
//}
|
||||
|
||||
@ -1846,9 +1846,9 @@ MedialAxis::build(ThickPolylines &polylines_out)
|
||||
// std::stringstream stri;
|
||||
// stri << "medial_axis_2_curve_" << id << ".svg";
|
||||
// SVG svg(stri.str());
|
||||
// svg.draw(*bounds);
|
||||
// svg.draw(this->expolygon);
|
||||
// svg.draw(pp);
|
||||
// svg.draw(*bounds, "grey");
|
||||
// svg.draw(this->expolygon, "green");
|
||||
// svg.draw(pp, "red");
|
||||
// svg.Close();
|
||||
//}
|
||||
|
||||
@ -1863,9 +1863,9 @@ MedialAxis::build(ThickPolylines &polylines_out)
|
||||
// std::stringstream stri;
|
||||
// stri << "medial_axis_3_fusion_" << id << ".svg";
|
||||
// SVG svg(stri.str());
|
||||
// svg.draw(bounds);
|
||||
// svg.draw(this->expolygon);
|
||||
// svg.draw(pp);
|
||||
// svg.draw(*bounds, "grey");
|
||||
// svg.draw(this->expolygon, "green");
|
||||
// svg.draw(pp, "red");
|
||||
// svg.Close();
|
||||
//}
|
||||
|
||||
@ -1875,6 +1875,15 @@ MedialAxis::build(ThickPolylines &polylines_out)
|
||||
// Loop through all returned polylines in order to extend their endpoints to the
|
||||
// expolygon boundaries (if done here, it may be cut later if not thick enough)
|
||||
if (stop_at_min_width) {
|
||||
//{
|
||||
// std::stringstream stri;
|
||||
// stri << "medial_axis_3_3_extends_" << id << ".svg";
|
||||
// SVG svg(stri.str());
|
||||
// svg.draw(*bounds, "grey");
|
||||
// svg.draw(this->expolygon, "green");
|
||||
// svg.draw(pp, "red");
|
||||
// svg.Close();
|
||||
//}
|
||||
extends_line_both_side(pp);
|
||||
}
|
||||
|
||||
@ -1886,14 +1895,24 @@ MedialAxis::build(ThickPolylines &polylines_out)
|
||||
std::cout << "\n";
|
||||
}*/
|
||||
//reduce extrusion when it's too thin to be printable
|
||||
//{
|
||||
// std::stringstream stri;
|
||||
// stri << "medial_axis_3_6_remove_thin_" << id << ".svg";
|
||||
// SVG svg(stri.str());
|
||||
// svg.draw(*bounds, "grey");
|
||||
// svg.draw(this->expolygon, "green");
|
||||
// svg.draw(pp, "red");
|
||||
// svg.Close();
|
||||
//}
|
||||
|
||||
remove_too_thin_extrusion(pp);
|
||||
//{
|
||||
// std::stringstream stri;
|
||||
// stri << "medial_axis_4_thinok_" << id << ".svg";
|
||||
// SVG svg(stri.str());
|
||||
// svg.draw(bounds);
|
||||
// svg.draw(this->expolygon);
|
||||
// svg.draw(pp);
|
||||
// svg.draw(*bounds, "grey");
|
||||
// svg.draw(this->expolygon, "green");
|
||||
// svg.draw(pp, "red");
|
||||
// svg.Close();
|
||||
//}
|
||||
|
||||
@ -1902,9 +1921,9 @@ MedialAxis::build(ThickPolylines &polylines_out)
|
||||
// std::stringstream stri;
|
||||
// stri << "medial_axis_5.0_thuinner_" << id << ".svg";
|
||||
// SVG svg(stri.str());
|
||||
// svg.draw(*bounds);
|
||||
// svg.draw(this->expolygon);
|
||||
// svg.draw(pp);
|
||||
// svg.draw(*bounds, "grey");
|
||||
// svg.draw(this->expolygon, "green");
|
||||
// svg.draw(pp, "red");
|
||||
// svg.Close();
|
||||
//}
|
||||
|
||||
@ -1917,9 +1936,9 @@ MedialAxis::build(ThickPolylines &polylines_out)
|
||||
// std::stringstream stri;
|
||||
// stri << "medial_axis_5_expand_" << id << ".svg";
|
||||
// SVG svg(stri.str());
|
||||
// svg.draw(*bounds);
|
||||
// svg.draw(this->expolygon);
|
||||
// svg.draw(pp);
|
||||
// svg.draw(*bounds, "grey");
|
||||
// svg.draw(this->expolygon, "green");
|
||||
// svg.draw(pp, "red");
|
||||
// svg.Close();
|
||||
//}
|
||||
//TODO: reduce the flow at the intersection ( + ) points on crossing?
|
||||
@ -1928,9 +1947,9 @@ MedialAxis::build(ThickPolylines &polylines_out)
|
||||
// std::stringstream stri;
|
||||
// stri << "medial_axis_6_concat_" << id << ".svg";
|
||||
// SVG svg(stri.str());
|
||||
// svg.draw(bounds);
|
||||
// svg.draw(this->expolygon);
|
||||
// svg.draw(pp);
|
||||
// svg.draw(*bounds, "grey");
|
||||
// svg.draw(this->expolygon, "green");
|
||||
// svg.draw(pp, "red");
|
||||
// svg.Close();
|
||||
//}
|
||||
|
||||
@ -1939,9 +1958,9 @@ MedialAxis::build(ThickPolylines &polylines_out)
|
||||
// std::stringstream stri;
|
||||
// stri << "medial_axis_8_tooshort_" << id << ".svg";
|
||||
// SVG svg(stri.str());
|
||||
// svg.draw(bounds);
|
||||
// svg.draw(this->expolygon);
|
||||
// svg.draw(pp);
|
||||
// svg.draw(*bounds, "grey");
|
||||
// svg.draw(this->expolygon, "green");
|
||||
// svg.draw(pp, "red");
|
||||
// svg.Close();
|
||||
//}
|
||||
|
||||
@ -1950,9 +1969,9 @@ MedialAxis::build(ThickPolylines &polylines_out)
|
||||
// std::stringstream stri;
|
||||
// stri << "medial_axis_9.1_end_" << id << ".svg";
|
||||
// SVG svg(stri.str());
|
||||
// svg.draw(*bounds);
|
||||
// svg.draw(this->expolygon);
|
||||
// svg.draw(pp);
|
||||
// svg.draw(*bounds, "grey");
|
||||
// svg.draw(this->expolygon, "green");
|
||||
// svg.draw(pp, "red");
|
||||
// svg.Close();
|
||||
//}
|
||||
if (nozzle_diameter != min_width) {
|
||||
@ -1965,9 +1984,9 @@ MedialAxis::build(ThickPolylines &polylines_out)
|
||||
// std::stringstream stri;
|
||||
// stri << "medial_axis_9.9_endnwithtaper_" << id << ".svg";
|
||||
// SVG svg(stri.str());
|
||||
// svg.draw(*bounds);
|
||||
// svg.draw(this->expolygon);
|
||||
// svg.draw(pp);
|
||||
// svg.draw(*bounds, "grey");
|
||||
// svg.draw(this->expolygon, "green");
|
||||
// svg.draw(pp, "red");
|
||||
// svg.Close();
|
||||
//}
|
||||
|
||||
@ -2136,7 +2155,7 @@ thin_variable_width(const ThickPolylines &polylines, ExtrusionRole role, Flow fl
|
||||
|
||||
// Append paths to collection.
|
||||
if (!paths.empty()) {
|
||||
if (paths.front().first_point().coincides_with(paths.back().last_point())) {
|
||||
if (paths.front().first_point().coincides_with_epsilon(paths.back().last_point())) {
|
||||
coll.append(ExtrusionLoop(paths));
|
||||
} else {
|
||||
if (role == erThinWall){
|
||||
|
@ -462,7 +462,7 @@ void PerimeterGenerator::process()
|
||||
// In case no perimeters are to be generated, loop_number will equal to -1.
|
||||
std::vector<PerimeterGeneratorLoops> contours(loop_number + 1); // depth => loops
|
||||
std::vector<PerimeterGeneratorLoops> holes(loop_number + 1); // depth => loops
|
||||
ThickPolylines thin_walls;
|
||||
ThickPolylines thin_walls_thickpolys;
|
||||
ExPolygons no_last_gapfill;
|
||||
// we loop one time more than needed in order to find gaps after the last perimeter was applied
|
||||
for (int i = 0;; ++i) { // outer loop is 0
|
||||
@ -562,7 +562,7 @@ void PerimeterGenerator::process()
|
||||
ma.use_bounds(bound)
|
||||
.use_min_real_width(scale_t(this->ext_perimeter_flow.nozzle_diameter))
|
||||
.use_tapers(thin_walls_overlap)
|
||||
.build(thin_walls);
|
||||
.build(thin_walls_thickpolys);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -937,20 +937,23 @@ void PerimeterGenerator::process()
|
||||
}
|
||||
|
||||
// append thin walls
|
||||
if (!thin_walls.empty()) {
|
||||
ExtrusionEntityCollection tw = thin_variable_width
|
||||
(thin_walls, erThinWall, this->ext_perimeter_flow, std::max(ext_perimeter_width/4, scale_t(this->print_config->resolution)));
|
||||
|
||||
entities.append(tw.entities);
|
||||
thin_walls.clear();
|
||||
if (!thin_walls_thickpolys.empty()) {
|
||||
if (this->object_config->thin_walls_merge) {
|
||||
_merge_thin_walls(entities, thin_walls_thickpolys);
|
||||
} else {
|
||||
ExtrusionEntityCollection tw = thin_variable_width
|
||||
(thin_walls_thickpolys, erThinWall, this->ext_perimeter_flow, std::max(ext_perimeter_width / 4, scale_t(this->print_config->resolution)));
|
||||
entities.append(tw.entities);
|
||||
}
|
||||
thin_walls_thickpolys.clear();
|
||||
}
|
||||
} else {
|
||||
if (this->object_config->thin_walls_merge) {
|
||||
ThickPolylines no_thin_walls;
|
||||
entities = this->_traverse_loops(contours.front(), no_thin_walls);
|
||||
_merge_thin_walls(entities, thin_walls);
|
||||
_merge_thin_walls(entities, thin_walls_thickpolys);
|
||||
} else {
|
||||
entities = this->_traverse_loops(contours.front(), thin_walls);
|
||||
entities = this->_traverse_loops(contours.front(), thin_walls_thickpolys);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1697,11 +1700,12 @@ void PerimeterGenerator::_merge_thin_walls(ExtrusionEntityCollection &extrusions
|
||||
} else {
|
||||
//first add the return path
|
||||
ExtrusionEntityCollection tws_second = tws;
|
||||
tws_second.reverse();
|
||||
change_flow.percent_extrusion = 0.1f;
|
||||
change_flow.use(tws_second);
|
||||
//force reverse
|
||||
for (ExtrusionPath &path : change_flow.paths)
|
||||
path.reverse();
|
||||
std::reverse(change_flow.paths.begin(), change_flow.paths.end());
|
||||
//std::reverse(change_flow.paths.begin(), change_flow.paths.end());
|
||||
searcher.search_result.loop->paths.insert(searcher.search_result.loop->paths.begin() + 1 + searcher.search_result.idx_path,
|
||||
change_flow.paths.begin(), change_flow.paths.end());
|
||||
|
@ -155,7 +155,7 @@ public:
|
||||
double distance_to(const Line &line) const;
|
||||
bool coincides_with(const Point &point) const { return this->x() == point.x() && this->y() == point.y(); }
|
||||
bool coincides_with_epsilon(const Point &point) const {
|
||||
return std::abs(this->x() - point.x()) < SCALED_EPSILON && std::abs(this->y() - point.y()) < SCALED_EPSILON;
|
||||
return std::abs(this->x() - point.x()) < SCALED_EPSILON/2 && std::abs(this->y() - point.y()) < SCALED_EPSILON/2;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -273,7 +273,7 @@ void concatThickPolylines(ThickPolylines& pp) {
|
||||
//concat polyline if only 2 polyline at a point
|
||||
for (size_t i = 0; i < pp.size(); ++i) {
|
||||
ThickPolyline *polyline = &pp[i];
|
||||
if (polyline->first_point().coincides_with(polyline->last_point())) {
|
||||
if (polyline->first_point().coincides_with_epsilon(polyline->last_point())) {
|
||||
polyline->endpoints.first = false;
|
||||
polyline->endpoints.second = false;
|
||||
continue;
|
||||
@ -287,25 +287,25 @@ void concatThickPolylines(ThickPolylines& pp) {
|
||||
for (size_t j = 0; j < pp.size(); ++j) {
|
||||
if (j == i) continue;
|
||||
ThickPolyline *other = &pp[j];
|
||||
if (polyline->last_point().coincides_with(other->last_point())) {
|
||||
if (polyline->last_point().coincides_with_epsilon(other->last_point())) {
|
||||
id_candidate_last_point = j;
|
||||
nbCandidate_last_point++;
|
||||
}
|
||||
if (polyline->last_point().coincides_with(other->first_point())) {
|
||||
if (polyline->last_point().coincides_with_epsilon(other->first_point())) {
|
||||
id_candidate_last_point = j;
|
||||
nbCandidate_last_point++;
|
||||
}
|
||||
if (polyline->first_point().coincides_with(other->last_point())) {
|
||||
if (polyline->first_point().coincides_with_epsilon(other->last_point())) {
|
||||
id_candidate_first_point = j;
|
||||
nbCandidate_first_point++;
|
||||
}
|
||||
if (polyline->first_point().coincides_with(other->first_point())) {
|
||||
if (polyline->first_point().coincides_with_epsilon(other->first_point())) {
|
||||
id_candidate_first_point = j;
|
||||
nbCandidate_first_point++;
|
||||
}
|
||||
}
|
||||
if (id_candidate_last_point == id_candidate_first_point && nbCandidate_first_point == 1 && nbCandidate_last_point == 1) {
|
||||
if (polyline->first_point().coincides_with(pp[id_candidate_first_point].first_point())) pp[id_candidate_first_point].reverse();
|
||||
if (polyline->first_point().coincides_with_epsilon(pp[id_candidate_first_point].first_point())) pp[id_candidate_first_point].reverse();
|
||||
// it's a trap! it's a loop!
|
||||
polyline->points.insert(polyline->points.end(), pp[id_candidate_first_point].points.begin() + 1, pp[id_candidate_first_point].points.end());
|
||||
polyline->width.insert(polyline->width.end(), pp[id_candidate_first_point].width.begin() + 1, pp[id_candidate_first_point].width.end());
|
||||
@ -316,7 +316,7 @@ void concatThickPolylines(ThickPolylines& pp) {
|
||||
} else {
|
||||
|
||||
if (nbCandidate_first_point == 1) {
|
||||
if (polyline->first_point().coincides_with(pp[id_candidate_first_point].first_point())) pp[id_candidate_first_point].reverse();
|
||||
if (polyline->first_point().coincides_with_epsilon(pp[id_candidate_first_point].first_point())) pp[id_candidate_first_point].reverse();
|
||||
//concat at front
|
||||
polyline->width[0] = std::max(polyline->width.front(), pp[id_candidate_first_point].width.back());
|
||||
polyline->points.insert(polyline->points.begin(), pp[id_candidate_first_point].points.begin(), pp[id_candidate_first_point].points.end() - 1);
|
||||
@ -336,7 +336,7 @@ void concatThickPolylines(ThickPolylines& pp) {
|
||||
polyline->endpoints.first = true;
|
||||
}
|
||||
if (nbCandidate_last_point == 1) {
|
||||
if (polyline->last_point().coincides_with(pp[id_candidate_last_point].last_point())) pp[id_candidate_last_point].reverse();
|
||||
if (polyline->last_point().coincides_with_epsilon(pp[id_candidate_last_point].last_point())) pp[id_candidate_last_point].reverse();
|
||||
//concat at back
|
||||
polyline->width[polyline->width.size() - 1] = std::max(polyline->width.back(), pp[id_candidate_last_point].width.front());
|
||||
polyline->points.insert(polyline->points.end(), pp[id_candidate_last_point].points.begin() + 1, pp[id_candidate_last_point].points.end());
|
||||
@ -353,7 +353,7 @@ void concatThickPolylines(ThickPolylines& pp) {
|
||||
polyline->endpoints.second = true;
|
||||
}
|
||||
|
||||
if (polyline->last_point().coincides_with(polyline->first_point())) {
|
||||
if (polyline->last_point().coincides_with_epsilon(polyline->first_point())) {
|
||||
//the concat has created a loop : update endpoints
|
||||
polyline->endpoints.first = false;
|
||||
polyline->endpoints.second = false;
|
||||
|
Loading…
x
Reference in New Issue
Block a user