diff --git a/Build.PL b/Build.PL index 0ff81d092..a8373a227 100644 --- a/Build.PL +++ b/Build.PL @@ -11,8 +11,7 @@ my $build = Module::Build->new( 'File::Basename' => '0', 'Getopt::Long' => '0', 'Math::Clipper' => '1.01', - 'Math::Geometry::Planar' => '0', - 'Math::Geometry::Planar::Offset' => '0', + 'Math::ConvexHull' => '1.0.4', 'Moo' => '0', 'Time::HiRes' => '0', 'XXX' => '0', diff --git a/lib/Slic3r/Fill/Rectilinear.pm b/lib/Slic3r/Fill/Rectilinear.pm index 81b9cb9a4..b5a026b13 100644 --- a/lib/Slic3r/Fill/Rectilinear.pm +++ b/lib/Slic3r/Fill/Rectilinear.pm @@ -11,7 +11,6 @@ use constant B => 1; use constant X => 0; use constant Y => 1; -use Math::Geometry::Planar; use POSIX qw(ceil); use XXX; @@ -28,7 +27,7 @@ sub make_fill { SURFACE: foreach my $surface (@{ $surface_collection->surfaces }) { Slic3r::debugf " Processing surface %s:\n", $surface->id; - my $polygon = $surface->mgp_polygon; + my $polygons = [ $surface->p ]; # set infill angle my (@rotate, @shift); @@ -45,7 +44,8 @@ sub make_fill { # rotate surface as needed @shift = @{ +(Slic3r::Geometry::rotate_points(@rotate, \@shift))[0] }; - $polygon = $polygon->rotate(@rotate)->move(@shift) if $rotate[0]; + @$polygons = map [ Slic3r::Geometry::move_points(\@shift, @$_) ], + map [ Slic3r::Geometry::rotate_points(@rotate, @$_) ], @$polygons if $rotate[0]; # force 100% density for external surfaces my $density = $surface->surface_type eq 'internal' ? $Slic3r::fill_density : 1; @@ -59,7 +59,7 @@ sub make_fill { # this arrayref will hold intersection points of the fill grid with surface segments my $points = [ map [], 0..$number_of_lines-1 ]; - foreach my $line (map $self->_lines_from_mgp_points($_), @{ $polygon->polygons }) { + foreach my $line (map Slic3r::Geometry::polygon_lines($_), @$polygons) { # find out the coordinates my @coordinates = map @$_, @$line; @@ -134,7 +134,7 @@ sub make_fill { my @search_points = @$row; @search_points = reverse @search_points if $direction == 1; - my @connectable_points = $self->find_connectable_points($polygon, $path_points[-1], $c, [@search_points]); + my @connectable_points = $self->find_connectable_points($polygons, $path_points[-1], $c, [@search_points]); Slic3r::debugf " ==> found %d connectable points = %s\n", scalar(@connectable_points), join ', ', @connectable_points if $Slic3r::debug; @@ -181,11 +181,11 @@ sub make_fill { # points connectable to a given one sub find_connectable_points { my $self = shift; - my ($polygon, $point, $c, $points) = @_; + my ($polygons, $point, $c, $points) = @_; my @connectable_points = (); foreach my $p (@$points) { - if (!Slic3r::Geometry::can_connect_points($point, [ $c, $p ], [ $polygon->get_polygons ])) { + if (!Slic3r::Geometry::can_connect_points($point, [ $c, $p ], $polygons)) { @connectable_points ? last : next; } push @connectable_points, $p; @@ -194,25 +194,4 @@ sub find_connectable_points { return @connectable_points; } -sub _lines_from_mgp_points { - my $self = shift; - my ($points) = @_; - - my @lines = (); - my $last_point = $points->[-1]; - foreach my $point (@$points) { - push @lines, [ $last_point, $point ]; - $last_point = $point; - } - return @lines; -} - -sub _mgp_from_points_ref { - my $self = shift; - my ($points) = @_; - my $p = Math::Geometry::Planar->new; - $p->points($points); - return $p; -} - 1; diff --git a/lib/Slic3r/Layer.pm b/lib/Slic3r/Layer.pm index c6e1a9503..2f25706d3 100644 --- a/lib/Slic3r/Layer.pm +++ b/lib/Slic3r/Layer.pm @@ -2,7 +2,6 @@ package Slic3r::Layer; use Moo; use Math::Clipper ':all'; -use Math::Geometry::Planar; use XXX; # a sequential number of layer, starting at 0 diff --git a/lib/Slic3r/Perimeter.pm b/lib/Slic3r/Perimeter.pm index a67b1cb64..e50a1aea8 100644 --- a/lib/Slic3r/Perimeter.pm +++ b/lib/Slic3r/Perimeter.pm @@ -2,7 +2,7 @@ package Slic3r::Perimeter; use Moo; use Math::Clipper ':all'; -use Math::Geometry::Planar; +use Math::ConvexHull qw(convex_hull); use XXX; use constant X => 0; @@ -77,14 +77,12 @@ sub make_perimeter { # generate skirt on bottom layer if ($layer->id == 0 && $Slic3r::skirts > 0 && @{ $layer->surfaces }) { # find out convex hull - my $points = [ map { @{ $_->mgp_polygon->polygons->[0] } } @{ $layer->surfaces } ]; - my $convex_hull = $self->_mgp_from_points_ref($points)->convexhull2; # maybe Math::ConvexHull is faster? - my $convex_hull_points = ref $convex_hull eq 'ARRAY' ? $convex_hull : $convex_hull->points; + my $convex_hull = convex_hull([ map @$_, map $_->p, @{ $layer->surfaces } ]); # draw outlines from outside to inside for (my $i = $Slic3r::skirts - 1; $i >= 0; $i--) { my $distance = ($Slic3r::skirt_distance + ($Slic3r::flow_width * $i)) / $Slic3r::resolution; - my $outline = offset([$convex_hull_points], $distance, $Slic3r::resolution * 100, JT_ROUND); + my $outline = offset([$convex_hull], $distance, $Slic3r::resolution * 100, JT_ROUND); push @{ $layer->skirts }, Slic3r::ExtrusionLoop->cast([ @{$outline->[0]} ]); } } @@ -120,12 +118,4 @@ sub offset_polygon { return @$results; } -sub _mgp_from_points_ref { - my $self = shift; - my ($points) = @_; - my $p = Math::Geometry::Planar->new; - $p->points($points); - return $p; -} - 1; diff --git a/lib/Slic3r/Polyline/Closed.pm b/lib/Slic3r/Polyline/Closed.pm index cc80cee0e..95fd11ee0 100644 --- a/lib/Slic3r/Polyline/Closed.pm +++ b/lib/Slic3r/Polyline/Closed.pm @@ -32,12 +32,4 @@ sub encloses_point { return Slic3r::Geometry::point_in_polygon($point->p, $self->p); } -sub mgp_polygon { - my $self = shift; - - my $p = Math::Geometry::Planar->new; - $p->points($self->points); - return $p; -} - 1; diff --git a/lib/Slic3r/Surface.pm b/lib/Slic3r/Surface.pm index dcd96a0d5..a6f4355a0 100644 --- a/lib/Slic3r/Surface.pm +++ b/lib/Slic3r/Surface.pm @@ -1,8 +1,6 @@ package Slic3r::Surface; use Moo; -use Math::Geometry::Planar; - has 'contour' => ( is => 'ro', #isa => 'Slic3r::Polyline::Closed', @@ -42,14 +40,6 @@ sub encloses_point { return 1; } -sub mgp_polygon { - my $self = shift; - - my $p = Math::Geometry::Planar->new; - $p->polygons([ $self->contour->p, map($_->p, @{ $self->holes }) ]); - return $p; -} - sub clipper_polygon { my $self = shift;