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; }
bool polygonCollidesWithlineSegment(Polygons& polys, Point& startPoint, Point& endPoint) { Point diff = endPoint - startPoint; PointMatrix transformation_matrix = PointMatrix(diff); Point transformed_startPoint = transformation_matrix.apply(startPoint); Point transformed_endPoint = transformation_matrix.apply(endPoint); return polygonCollidesWithlineSegment(polys, transformed_startPoint, transformed_endPoint, transformation_matrix); }
bool polygonCollidesWithlineSegment(Polygons& polys, Point& transformed_startPoint, Point& transformed_endPoint, PointMatrix transformation_matrix) { for(PolygonRef poly : polys) { if (poly.size() == 0) { continue; } if (polygonCollidesWithlineSegment(poly, transformed_startPoint, transformed_endPoint, transformation_matrix)) { return true; } } return false; }