Ported ExPolygon->area()

This commit is contained in:
Alessandro Ranellucci 2013-08-26 22:50:26 +02:00
parent 792fcba7be
commit 706851f836
7 changed files with 19 additions and 12 deletions

View File

@ -126,13 +126,6 @@ sub simplify {
return @{ Slic3r::Geometry::Clipper::union_ex([ $self->simplify_as_polygons($tolerance) ]) };
}
sub area {
my $self = shift;
my $area = $self->contour->area;
$area -= $_->area for $self->holes;
return $area;
}
# this method only works for expolygons having only a contour or
# a contour and a hole, and not being thicker than the supplied
# width. it returns a polyline or a polygon

View File

@ -30,6 +30,16 @@ ExPolygon::rotate(double angle, Point* center)
}
}
double
ExPolygon::area() const
{
double a = this->contour.area();
for (Polygons::const_iterator it = this->holes.begin(); it != this->holes.end(); ++it) {
a -= -(*it).area(); // holes have negative area
}
return a;
}
SV*
ExPolygon::to_SV() {
const unsigned int num_holes = this->holes.size();

View File

@ -19,6 +19,7 @@ class ExPolygon
void scale(double factor);
void translate(double x, double y);
void rotate(double angle, Point* center);
double area() const;
};
typedef std::vector<ExPolygon> ExPolygons;

View File

@ -55,7 +55,7 @@ Polygon::split_at_first_point()
}
double
Polygon::area()
Polygon::area() const
{
ClipperLib::Polygon p;
Slic3rPolygon_to_ClipperPolygon(*this, p);
@ -63,7 +63,7 @@ Polygon::area()
}
bool
Polygon::is_counter_clockwise()
Polygon::is_counter_clockwise() const
{
ClipperLib::Polygon* p = new ClipperLib::Polygon();
Slic3rPolygon_to_ClipperPolygon(*this, *p);

View File

@ -16,8 +16,8 @@ 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();
double area() const;
bool is_counter_clockwise() const;
bool make_counter_clockwise();
bool make_clockwise();
};

View File

@ -4,7 +4,7 @@ use strict;
use warnings;
use Slic3r::XS;
use Test::More tests => 17;
use Test::More tests => 18;
use constant PI => 4 * atan2(1, 1);
@ -40,6 +40,8 @@ is_deeply $expolygon->clone->pp, [$square, $hole_in_square], 'clone';
# The following tests implicitely check that modifying clones
# does not modify the original one.
is $expolygon->area, 100*100-20*20, 'area';
{
my $expolygon2 = $expolygon->clone;
$expolygon2->scale(2.5);

View File

@ -15,6 +15,7 @@
%code{% RETVAL = THIS->to_SV_pureperl(); %};
void scale(double factor);
void translate(double x, double y);
double area();
%{
ExPolygon*