diff --git a/lib/Slic3r/Polygon.pm b/lib/Slic3r/Polygon.pm index 289c2749a..7241491bf 100644 --- a/lib/Slic3r/Polygon.pm +++ b/lib/Slic3r/Polygon.pm @@ -8,7 +8,6 @@ use parent 'Slic3r::Polyline'; use Slic3r::Geometry qw(polygon_remove_parallel_continuous_edges polygon_remove_acute_vertices polygon_segment_having_point PI X1 X2 Y1 Y2 epsilon); -use Slic3r::Geometry::Clipper qw(JT_MITER); sub wkt { my $self = shift; @@ -34,11 +33,6 @@ sub encloses_point { return Boost::Geometry::Utils::point_covered_by_polygon($point->pp, [$self->pp]); } -sub area { - my $self = shift; - return Slic3r::Geometry::Clipper::area($self->pp); -} - sub grow { my $self = shift; return $self->split_at_first_point->grow(@_); diff --git a/xs/src/Polygon.cpp b/xs/src/Polygon.cpp index dcb07e4ca..bff261c25 100644 --- a/xs/src/Polygon.cpp +++ b/xs/src/Polygon.cpp @@ -54,6 +54,14 @@ Polygon::split_at_first_point() return this->split_at_index(0); } +double +Polygon::area() +{ + ClipperLib::Polygon p; + Slic3rPolygon_to_ClipperPolygon(*this, p); + return ClipperLib::Area(p); +} + bool Polygon::is_counter_clockwise() { diff --git a/xs/src/Polygon.hpp b/xs/src/Polygon.hpp index bb9d2f077..7186eb65a 100644 --- a/xs/src/Polygon.hpp +++ b/xs/src/Polygon.hpp @@ -16,6 +16,7 @@ class Polygon : public MultiPoint { Polyline* split_at(const Point* point); Polyline* split_at_index(int index); Polyline* split_at_first_point(); + double area(); bool is_counter_clockwise(); bool make_counter_clockwise(); bool make_clockwise(); diff --git a/xs/t/06_polygon.t b/xs/t/06_polygon.t index b93ae24ec..cf81c5e46 100644 --- a/xs/t/06_polygon.t +++ b/xs/t/06_polygon.t @@ -4,7 +4,7 @@ use strict; use warnings; use Slic3r::XS; -use Test::More tests => 11; +use Test::More tests => 12; my $square = [ # ccw [100, 100], @@ -30,6 +30,7 @@ is_deeply [ map $_->pp, @$lines ], [ is_deeply $polygon->split_at_first_point->pp, [ @$square[0,1,2,3,0] ], 'split_at_first_point'; is_deeply $polygon->split_at_index(2)->pp, [ @$square[2,3,0,1,2] ], 'split_at_index'; is_deeply $polygon->split_at(Slic3r::Point->new(@{$square->[2]}))->pp, [ @$square[2,3,0,1,2] ], 'split_at'; +is $polygon->area, 100*100, 'area'; ok $polygon->is_counter_clockwise, 'is_counter_clockwise'; { diff --git a/xs/xsp/Polygon.xsp b/xs/xsp/Polygon.xsp index e425c80a8..7b8578d8b 100644 --- a/xs/xsp/Polygon.xsp +++ b/xs/xsp/Polygon.xsp @@ -23,6 +23,7 @@ %code{% const char* CLASS = "Slic3r::Polyline"; RETVAL = THIS->split_at_index(index); %}; Polyline* split_at_first_point() %code{% const char* CLASS = "Slic3r::Polyline"; RETVAL = THIS->split_at_first_point(); %}; + double area(); bool is_counter_clockwise(); bool make_counter_clockwise(); bool make_clockwise();