Ported Polygon->split_at()
This commit is contained in:
parent
f8ac3aa68f
commit
1f734807b9
@ -96,23 +96,6 @@ sub is_valid {
|
|||||||
return @$self >= 3;
|
return @$self >= 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub split_at {
|
|
||||||
my $self = shift;
|
|
||||||
my ($point) = @_;
|
|
||||||
|
|
||||||
# find index of point
|
|
||||||
my $i = -1;
|
|
||||||
for (my $n = 0; $n <= $#$self; $n++) {
|
|
||||||
if (Slic3r::Geometry::same_point($point, $self->[$n])) {
|
|
||||||
$i = $n;
|
|
||||||
last;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
die "Point not found" if $i == -1;
|
|
||||||
|
|
||||||
return $self->split_at_index($i);
|
|
||||||
}
|
|
||||||
|
|
||||||
# for cw polygons this will return convex points!
|
# for cw polygons this will return convex points!
|
||||||
sub concave_points {
|
sub concave_points {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
@ -26,7 +26,7 @@ Point::rotate(double angle, Point* center)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Point::coincides_with(Point* point)
|
Point::coincides_with(const Point* point) const
|
||||||
{
|
{
|
||||||
return this->x == point->x && this->y == point->y;
|
return this->x == point->x && this->y == point->y;
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ class Point
|
|||||||
void scale(double factor);
|
void scale(double factor);
|
||||||
void translate(double x, double y);
|
void translate(double x, double y);
|
||||||
void rotate(double angle, Point* center);
|
void rotate(double angle, Point* center);
|
||||||
bool coincides_with(Point* point);
|
bool coincides_with(const Point* point) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<Point> Points;
|
typedef std::vector<Point> Points;
|
||||||
|
@ -23,6 +23,18 @@ Polygon::lines()
|
|||||||
return lines;
|
return lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Polyline*
|
||||||
|
Polygon::split_at(const Point* point)
|
||||||
|
{
|
||||||
|
// find index of point
|
||||||
|
for (Points::const_iterator it = this->points.begin(); it != this->points.end(); ++it) {
|
||||||
|
if ((*it).coincides_with(point)) {
|
||||||
|
return this->split_at_index(it - this->points.begin());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw "Point not found";
|
||||||
|
}
|
||||||
|
|
||||||
Polyline*
|
Polyline*
|
||||||
Polygon::split_at_index(int index)
|
Polygon::split_at_index(int index)
|
||||||
{
|
{
|
||||||
|
@ -13,6 +13,7 @@ class Polygon : public MultiPoint {
|
|||||||
public:
|
public:
|
||||||
SV* to_SV_ref();
|
SV* to_SV_ref();
|
||||||
Lines lines();
|
Lines lines();
|
||||||
|
Polyline* split_at(const Point* point);
|
||||||
Polyline* split_at_index(int index);
|
Polyline* split_at_index(int index);
|
||||||
Polyline* split_at_first_point();
|
Polyline* split_at_first_point();
|
||||||
bool is_counter_clockwise();
|
bool is_counter_clockwise();
|
||||||
|
@ -4,7 +4,7 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
use Slic3r::XS;
|
use Slic3r::XS;
|
||||||
use Test::More tests => 10;
|
use Test::More tests => 11;
|
||||||
|
|
||||||
my $square = [ # ccw
|
my $square = [ # ccw
|
||||||
[100, 100],
|
[100, 100],
|
||||||
@ -29,6 +29,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_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_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';
|
||||||
|
|
||||||
ok $polygon->is_counter_clockwise, 'is_counter_clockwise';
|
ok $polygon->is_counter_clockwise, 'is_counter_clockwise';
|
||||||
{
|
{
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
void translate(double x, double y);
|
void translate(double x, double y);
|
||||||
void reverse();
|
void reverse();
|
||||||
Lines lines();
|
Lines lines();
|
||||||
|
Polyline* split_at(Point* point)
|
||||||
|
%code{% const char* CLASS = "Slic3r::Polyline"; RETVAL = THIS->split_at(point); %};
|
||||||
Polyline* split_at_index(int index)
|
Polyline* split_at_index(int index)
|
||||||
%code{% const char* CLASS = "Slic3r::Polyline"; RETVAL = THIS->split_at_index(index); %};
|
%code{% const char* CLASS = "Slic3r::Polyline"; RETVAL = THIS->split_at_index(index); %};
|
||||||
Polyline* split_at_first_point()
|
Polyline* split_at_first_point()
|
||||||
|
Loading…
Reference in New Issue
Block a user