@@ -701,17 +701,20 @@ struct ExpansionRange
701701 } range;
702702 } data;
703703
704+ const TransformedSegment* supporting_segment;
704705 bool is_set;
705706
706- ExpansionRange (const Point2LL& start, const Point2LL& end)
707+ ExpansionRange (const Point2LL& start, const Point2LL& end, const TransformedSegment* supporting_segment )
707708 : data{ .segment = BoundedSegment (start, end) }
709+ , supporting_segment(supporting_segment)
708710 , is_set(true )
709711 {
710712 }
711713
712- ExpansionRange (const coord_t min_y, const coord_t max_y)
714+ ExpansionRange (const coord_t min_y, const coord_t max_y, const TransformedSegment* supporting_segment )
713715 : data{ .range = { .min_y = min_y, .max_y = max_y } }
714716 , is_set(false )
717+ , supporting_segment(supporting_segment)
715718 {
716719 }
717720
@@ -802,7 +805,7 @@ void expandSegment(
802805 const int8_t expand_direction = sign (segment.end .Y - segment.start .Y );
803806
804807 std::vector<ExpansionRange> expanded_ranges;
805- expanded_ranges.push_back (ExpansionRange (segment.min_y , segment.max_y ));
808+ expanded_ranges.push_back (ExpansionRange (segment.min_y , segment.max_y , &segment ));
806809
807810 for (const TransformedSegment& infill_line_below : infill_lines_below)
808811 {
@@ -830,7 +833,7 @@ void expandSegment(
830833 }
831834 };
832835
833- for (const auto & [index, expanded_range] : expanded_ranges | ranges::views::enumerate )
836+ for (const ExpansionRange& expanded_range : expanded_ranges)
834837 {
835838 const std::optional<SegmentOverlapping> range_overlapping = expanded_range.calculateOverlapping (line_part, -expand_direction);
836839 if (! range_overlapping.has_value ())
@@ -853,7 +856,7 @@ void expandSegment(
853856
854857 if (! replacing_range.has_value ())
855858 {
856- replacing_range = ExpansionRange (range_overlapping->other_overlapping_part .start , range_overlapping->other_overlapping_part .end );
859+ replacing_range = ExpansionRange (range_overlapping->other_overlapping_part .start , range_overlapping->other_overlapping_part .end , &infill_line_below );
857860 }
858861 else
859862 {
@@ -881,31 +884,60 @@ void expandSegment(
881884 }
882885 }
883886
884- OpenPolyline filled_expanded_ranges;
887+ if (expand_direction < 0 )
888+ {
889+ ranges::reverse (expanded_ranges);
890+ }
891+
892+ constexpr bool only_if_forming_segment = true ;
885893 for (ExpansionRange& expanded_range : expanded_ranges)
886894 {
887- if (! expanded_range.is_set )
895+ if (expanded_range.supporting_segment == current_supporting_infill_line )
888896 {
889- // This is an unitialized range, use the raw segment
890- const coord_t & min_y = expanded_range.data .range .min_y ;
891- const coord_t & max_y = expanded_range.data .range .max_y ;
892- filled_expanded_ranges.push_back (Point2LL (LinearAlg2D::lineHorizontalLineIntersection (segment.start , segment.end , min_y).value (), min_y));
893- filled_expanded_ranges.push_back (Point2LL (LinearAlg2D::lineHorizontalLineIntersection (segment.start , segment.end , max_y).value (), max_y));
897+ continue ;
898+ }
899+
900+ if (current_supporting_infill_line == nullptr )
901+ {
902+ // This is the first iteration for this polygon, add the initial point
903+ if (! expanded_range.is_set )
904+ {
905+ // This is an unitialized range, use the raw segment
906+ expanded_polygon.push_back (segment.start );
907+ }
908+ else
909+ {
910+ expanded_polygon.push_back (expand_direction > 0 ? expanded_range.data .segment .start : expanded_range.data .segment .end , only_if_forming_segment);
911+ }
894912 }
895913 else
896914 {
897- constexpr bool only_if_forming_segment = true ;
898- filled_expanded_ranges.push_back (expanded_range.data .segment .start , only_if_forming_segment);
899- filled_expanded_ranges.push_back (expanded_range.data .segment .end , only_if_forming_segment);
915+ Point2LL next_start_position;
916+
917+ if (! expanded_range.is_set )
918+ {
919+ // This is an unitialized range, use the raw segment
920+ const coord_t position_switch_y = expand_direction > 0 ? expanded_range.data .range .min_y : expanded_range.data .range .max_y ;
921+ next_start_position = Point2LL (LinearAlg2D::lineHorizontalLineIntersection (segment.start , segment.end , position_switch_y).value_or (0 ), position_switch_y);
922+ }
923+ else
924+ {
925+ next_start_position = expand_direction > 0 ? expanded_range.data .segment .start : expanded_range.data .segment .end ;
926+ }
927+
928+ // Add point to close anchoring to previous infill line
929+ expanded_polygon.push_back (
930+ Point2LL (
931+ LinearAlg2D::lineHorizontalLineIntersection (current_supporting_infill_line->start , current_supporting_infill_line->end , next_start_position.Y ).value_or (0 ),
932+ next_start_position.Y ),
933+ only_if_forming_segment);
934+
935+ // Add point to start anchoring on new infill line
936+ expanded_polygon.push_back (next_start_position);
900937 }
901- }
902938
903- if (expand_direction < 0 )
904- {
905- filled_expanded_ranges.reverse ();
939+ current_supporting_infill_line = expanded_range.supporting_segment ;
906940 }
907-
908- expanded_polygon.push_back (std::move (filled_expanded_ranges));
909941}
910942
911943std::tuple<Shape, AngleDegrees> makeBridgeOverInfillPrintable (
@@ -961,11 +993,13 @@ std::tuple<Shape, AngleDegrees> makeBridgeOverInfillPrintable(
961993 Shape transformed_expanded_infill_below_skin_area;
962994 for (const Polygon& infill_below_skin_polygon : infill_below_skin_area)
963995 {
996+ TransformedShape transformed_infill_below_skin_polygon;
997+ transformPolygon (infill_below_skin_polygon, matrix, transformed_infill_below_skin_polygon);
998+
964999 Polygon expanded_polygon;
9651000 const TransformedSegment* current_supporting_infill_line = nullptr ;
966- for (auto iterator = infill_below_skin_polygon. beginSegments (); iterator != infill_below_skin_polygon. endSegments (); ++iterator )
1001+ for (const TransformedSegment& transformed_infill_below_skin_segment : transformed_infill_below_skin_polygon. segments )
9671002 {
968- TransformedSegment transformed_infill_below_skin_segment ((*iterator).start , (*iterator).end , matrix);
9691003 expandSegment (transformed_infill_below_skin_segment, filtered_infill_lines_below.segments , expanded_polygon, current_supporting_infill_line);
9701004 }
9711005 transformed_expanded_infill_below_skin_area.push_back (std::move (expanded_polygon));
0 commit comments