Skip to content

Commit 1414a37

Browse files
committed
Simplify output polygon
CURA-12361
1 parent de05a89 commit 1414a37

File tree

1 file changed

+57
-23
lines changed

1 file changed

+57
-23
lines changed

src/bridge.cpp

Lines changed: 57 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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

911943
std::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

Comments
 (0)