Reapply correct optimization for simplifiying fill_surfaces before performing the offset. #1325
This commit is contained in:
parent
9433048873
commit
e29aca3553
5 changed files with 40 additions and 12 deletions
|
@ -145,15 +145,21 @@ sub clip_line {
|
||||||
return Boost::Geometry::Utils::polygon_multi_linestring_intersection($self, [$line]);
|
return Boost::Geometry::Utils::polygon_multi_linestring_intersection($self, [$line]);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub simplify {
|
sub simplify_as_polygons {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my ($tolerance) = @_;
|
my ($tolerance) = @_;
|
||||||
|
|
||||||
# it would be nice to have a multilinestring_simplify method in B::G::U
|
# it would be nice to have a multilinestring_simplify method in B::G::U
|
||||||
my @simplified = Slic3r::Geometry::Clipper::simplify_polygons(
|
return Slic3r::Geometry::Clipper::simplify_polygons(
|
||||||
[ map Boost::Geometry::Utils::linestring_simplify($_, $tolerance), @$self ],
|
[ map Boost::Geometry::Utils::linestring_simplify($_, $tolerance), @$self ],
|
||||||
);
|
);
|
||||||
return @{ Slic3r::Geometry::Clipper::union_ex([ @simplified ]) };
|
}
|
||||||
|
|
||||||
|
sub simplify {
|
||||||
|
my $self = shift;
|
||||||
|
my ($tolerance) = @_;
|
||||||
|
|
||||||
|
return @{ Slic3r::Geometry::Clipper::union_ex([ $self->simplify_as_polygons($tolerance) ]) };
|
||||||
}
|
}
|
||||||
|
|
||||||
sub scale {
|
sub scale {
|
||||||
|
|
|
@ -150,12 +150,14 @@ sub collapse_ex {
|
||||||
|
|
||||||
sub simplify_polygon {
|
sub simplify_polygon {
|
||||||
my ($polygon, $pft) = @_;
|
my ($polygon, $pft) = @_;
|
||||||
return @{ Math::Clipper::simplify_polygon($polygon, $pft // PFT_NONZERO) };
|
return map Slic3r::Polygon->new(@$_),
|
||||||
|
@{ Math::Clipper::simplify_polygon($polygon, $pft // PFT_NONZERO) };
|
||||||
}
|
}
|
||||||
|
|
||||||
sub simplify_polygons {
|
sub simplify_polygons {
|
||||||
my ($polygons, $pft) = @_;
|
my ($polygons, $pft) = @_;
|
||||||
return @{ Math::Clipper::simplify_polygons($polygons, $pft // PFT_NONZERO) };
|
return map Slic3r::Polygon->new(@$_),
|
||||||
|
@{ Math::Clipper::simplify_polygons($polygons, $pft // PFT_NONZERO) };
|
||||||
}
|
}
|
||||||
|
|
||||||
sub traverse_pt {
|
sub traverse_pt {
|
||||||
|
|
|
@ -209,12 +209,11 @@ sub make_perimeters {
|
||||||
# and then we offset back and forth by the infill spacing to only consider the
|
# and then we offset back and forth by the infill spacing to only consider the
|
||||||
# non-collapsing regions
|
# non-collapsing regions
|
||||||
push @{ $self->fill_surfaces },
|
push @{ $self->fill_surfaces },
|
||||||
map $_->simplify(&Slic3r::SCALED_RESOLUTION),
|
offset2_ex(
|
||||||
offset2_ex(
|
[ map $_->simplify_as_polygons(&Slic3r::SCALED_RESOLUTION), @{union_ex(\@last)} ],
|
||||||
\@last,
|
-($perimeter_spacing/2 + $infill_spacing),
|
||||||
-($perimeter_spacing/2 + $infill_spacing),
|
+$infill_spacing,
|
||||||
+$infill_spacing,
|
);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$self->_fill_gaps(\@gaps);
|
$self->_fill_gaps(\@gaps);
|
||||||
|
|
|
@ -72,6 +72,8 @@ sub grow {
|
||||||
return $self->split_at_first_point->grow(@_);
|
return $self->split_at_first_point->grow(@_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# NOTE that this will turn the polygon to ccw regardless of its
|
||||||
|
# original orientation
|
||||||
sub simplify {
|
sub simplify {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
return Slic3r::Geometry::Clipper::simplify_polygon( $self->SUPER::simplify(@_) );
|
return Slic3r::Geometry::Clipper::simplify_polygon( $self->SUPER::simplify(@_) );
|
||||||
|
|
|
@ -2,7 +2,7 @@ use Test::More;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
plan tests => 8;
|
plan tests => 10;
|
||||||
|
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use FindBin;
|
use FindBin;
|
||||||
|
@ -84,6 +84,25 @@ use Slic3r;
|
||||||
is_deeply \@simplified_ex, [ \@simplified ], 'simplified polygon equals simplified expolygon';
|
is_deeply \@simplified_ex, [ \@simplified ], 'simplified polygon equals simplified expolygon';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
my $square = Slic3r::Polygon->new( # ccw
|
||||||
|
[100, 100],
|
||||||
|
[200, 100],
|
||||||
|
[200, 200],
|
||||||
|
[100, 200],
|
||||||
|
);
|
||||||
|
my $hole_in_square = Slic3r::Polygon->new( # cw
|
||||||
|
[140, 140],
|
||||||
|
[140, 160],
|
||||||
|
[160, 160],
|
||||||
|
[160, 140],
|
||||||
|
);
|
||||||
|
my $expolygon = Slic3r::ExPolygon->new($square, $hole_in_square);
|
||||||
|
my @simplified = $hole_in_square->simplify;
|
||||||
|
is scalar(@simplified), 1, 'hole simplification returns one polygon';
|
||||||
|
ok $simplified[0]->is_counter_clockwise, 'hole simplification turns cw polygon into ccw polygon';
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
my $circle = [
|
my $circle = [
|
||||||
[3744.8,8045.8],[3788.1,8061.4],[3940.6,8116.3],[3984.8,8129.2],[4140.6,8174.4],[4185.5,8184.4],[4343.8,8219.9],
|
[3744.8,8045.8],[3788.1,8061.4],[3940.6,8116.3],[3984.8,8129.2],[4140.6,8174.4],[4185.5,8184.4],[4343.8,8219.9],
|
||||||
|
|
Loading…
Reference in a new issue