void LinePolygonsCrossings::getBasicCombingPath(PolyCrossings& polyCrossings, CombPath& combPath) { PolygonRef poly = boundary[polyCrossings.poly_idx]; combPath.push_back(transformation_matrix.unapply(Point(polyCrossings.min.x - dist_to_move_boundary_point_outside, transformed_startPoint.Y))); if ( ( polyCrossings.max.point_idx - polyCrossings.min.point_idx + poly.size() ) % poly.size() < poly.size() / 2 ) { // follow the path in the same direction as the winding order of the boundary polygon for(unsigned int point_idx = polyCrossings.min.point_idx ; point_idx != polyCrossings.max.point_idx ; point_idx = (point_idx < poly.size() - 1) ? (point_idx + 1) : (0)) { combPath.push_back(PolygonUtils::getBoundaryPointWithOffset(poly, point_idx, dist_to_move_boundary_point_outside)); } } else { // follow the path in the opposite direction of the winding order of the boundary polygon unsigned int min_idx = (polyCrossings.min.point_idx == 0)? poly.size() - 1: polyCrossings.min.point_idx - 1; unsigned int max_idx = (polyCrossings.max.point_idx == 0)? poly.size() - 1: polyCrossings.max.point_idx - 1; for(unsigned int point_idx = min_idx; point_idx != max_idx; point_idx = (point_idx > 0) ? (point_idx - 1) : (poly.size() - 1)) { combPath.push_back(PolygonUtils::getBoundaryPointWithOffset(poly, point_idx, dist_to_move_boundary_point_outside)); } } combPath.push_back(transformation_matrix.unapply(Point(polyCrossings.max.x + dist_to_move_boundary_point_outside, transformed_startPoint.Y))); }
void LinePolygonsCrossings::getCombingPath(CombPath& combPath) { if (shorterThen(endPoint - startPoint, Comb::max_comb_distance_ignored) || !lineSegmentCollidesWithBoundary()) { //We're not crossing any boundaries. So skip the comb generation. combPath.push_back(startPoint); combPath.push_back(endPoint); return; } calcScanlineCrossings(); CombPath basicPath; getBasicCombingPath(basicPath); optimizePath(basicPath, combPath); }
bool LinePolygonsCrossings::optimizePath(CombPath& comb_path, CombPath& optimized_comb_path) { optimized_comb_path.push_back(startPoint); for(unsigned int point_idx = 1; point_idx<comb_path.size(); point_idx++) { Point& current_point = optimized_comb_path.back(); if (polygonCollidesWithlineSegment(boundary, current_point, comb_path[point_idx])) { if (polygonCollidesWithlineSegment(boundary, current_point, comb_path[point_idx - 1])) { comb_path.cross_boundary = true; } optimized_comb_path.push_back(comb_path[point_idx - 1]); } else { // : dont add the newest point // TODO: add the below extra optimization? (+/- 7% extra computation time, +/- 2% faster print for Dual_extrusion_support_generation.stl) while (optimized_comb_path.size() > 1) { if (polygonCollidesWithlineSegment(boundary, optimized_comb_path[optimized_comb_path.size() - 2], comb_path[point_idx])) { break; } else { optimized_comb_path.pop_back(); } } } } return true; }
void LinePolygonsCrossings::getBasicCombingPath(CombPath& combPath) { for (PolyCrossings* crossing = getNextPolygonAlongScanline(transformed_startPoint.X) ; crossing != nullptr ; crossing = getNextPolygonAlongScanline(crossing->max.x)) { getBasicCombingPath(*crossing, combPath); } combPath.push_back(endPoint); }
void LinePolygonsCrossings::getBasicCombingPath(CombPath& combPath) { for (PolyCrossings crossing = getNextPolygonAlongScanline(transformed_startPoint.X) ; crossing.poly_idx != NO_INDEX ; crossing = getNextPolygonAlongScanline(crossing.max.x)) { getBasicCombingPath(crossing, combPath); } combPath.push_back(endPoint); }
bool LinePolygonsCrossings::getCombingPath(CombPath& combPath, int64_t max_comb_distance_ignored, bool fail_on_unavoidable_obstacles) { if (shorterThen(endPoint - startPoint, max_comb_distance_ignored) || !lineSegmentCollidesWithBoundary()) { //We're not crossing any boundaries. So skip the comb generation. combPath.push_back(startPoint); combPath.push_back(endPoint); return true; } bool success = calcScanlineCrossings(fail_on_unavoidable_obstacles); if (!success) { return false; } CombPath basicPath; getBasicCombingPath(basicPath); optimizePath(basicPath, combPath); // combPath = basicPath; // uncomment to disable comb path optimization return true; }