PrusaSlicer-NonPlainar/lib/Slic3r/Polyline/Closed.pm

73 lines
2.0 KiB
Perl
Raw Normal View History

2011-09-01 19:06:28 +00:00
package Slic3r::Polyline::Closed;
use Moo;
2011-09-01 19:06:28 +00:00
extends 'Slic3r::Polyline';
has 'contour_of' => (
is => 'rw',
#isa => 'Slic3r::Surface',
2011-09-01 19:06:28 +00:00
weak_ref => 1,
);
has 'hole_of' => (
is => 'rw',
#isa => 'Slic3r::Surface',
2011-09-01 19:06:28 +00:00
weak_ref => 1,
);
sub new_from_points {
2011-09-01 19:06:28 +00:00
my $class = shift;
my $polyline = $class->SUPER::new_from_points(@_);
2011-09-01 19:06:28 +00:00
# polylines must be always closed, otherwise it means that our object is not manifold!
die "Polylines must be closed! Object not manifold?\n"
if ($polyline->lines->[0]->a != $polyline->lines->[-1]->b);
return $polyline;
}
2011-09-01 19:06:28 +00:00
sub encloses_point {
my $self = shift;
my ($point) = @_;
my @xy = map { $_->x, $_->y } $self->points; #}}
my ($x, $y) = ($point->x, $point->y); #))
# Derived from the comp.graphics.algorithms FAQ,
# courtesy of Wm. Randolph Franklin
my $n = @xy / 2; # Number of points in polygon
my @i = map { 2*$_ } 0..(@xy/2); # The even indices of @xy
my @x = map { $xy[$_] } @i; # Even indices: x-coordinates
my @y = map { $xy[$_ + 1] } @i; # Odd indices: y-coordinates
my ($i, $j);
my $side = 0; # 0 = outside; 1 = inside
for ($i = 0, $j = $n - 1; $i < $n; $j = $i++) {
if (
# If the y is between the (y-) borders...
($y[$i] <= $y && $y < $y[$j]) || ($y[$j] <= $y && $y < $y[$i])
and
# ...the (x,y) to infinity line crosses the edge
# from the ith point to the jth point...
($x < ($x[$j] - $x[$i]) * ($y - $y[$i]) / ($y[$j] - $y[$i]) + $x[$i])
) {
$side = not $side; # Jump the fence
}
}
return $side;
}
2011-09-02 19:10:20 +00:00
sub mgp_polygon {
my $self = shift;
# we need a list of ordered points
my $points = $self->ordered_points;
my $p = Math::Geometry::Planar->new;
$p->points($points);
return $p;
}
2011-09-01 19:06:28 +00:00
1;