Additions to Geometry.pm and allow function exporting

This commit is contained in:
Alessandro Ranellucci 2011-10-07 21:19:18 +02:00
parent 743f2abcf2
commit 3274f3978b

View File

@ -2,6 +2,21 @@ package Slic3r::Geometry;
use strict;
use warnings;
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(
epsilon slope line_atan lines_parallel three_points_aligned
line_point_belongs_to_segment points_coincide distance_between_points
line_length midpoint point_in_polygon point_in_segment segment_in_segment
point_is_on_left_of_segment polyline_lines polygon_lines nearest_point
point_along_segment polygon_segment_having_point polygon_has_subsegment
polygon_has_vertex polyline_length can_connect_points deg2rad rad2deg
rotate_points move_points remove_coinciding_points clip_segment_polygon
sum_vectors multiply_vector subtract_vectors dot perp polygon_points_visibility
line_intersection bounding_box bounding_box_intersect
clip_segment_complex_polygon longest_segment
);
use Slic3r::Geometry::DouglasPeucker;
use XXX;
@ -32,6 +47,11 @@ sub lines_parallel {
return abs(line_atan($line1) - line_atan($line2)) < $parallel_degrees_limit;
}
sub three_points_aligned {
my ($p1, $p2, $p3) = @_;
return lines_parallel([$p1, $p2], [$p2, $p3]);
}
# this subroutine checks whether a given point may belong to a given
# segment given the hypothesis that it belongs to the line containing
# the segment
@ -67,6 +87,20 @@ sub line_length {
return distance_between_points(@$line[A, B]);
}
sub longest_segment {
my (@lines) = @_;
my ($longest, $maxlength);
foreach my $line (@lines) {
my $line_length = line_length($line);
if (!defined $longest || $line_length > $maxlength) {
$longest = $line;
$maxlength = $line_length;
}
}
return $longest;
}
sub midpoint {
my ($line) = @_;
return [ ($line->[B][X] + $line->[A][X]) / 2, ($line->[B][Y] + $line->[A][Y]) / 2 ];
@ -517,12 +551,13 @@ sub clip_segment_complex_polygon {
&& !grep(polygon_segment_having_point($_, $intersections[0]), @$polygons);
# defensive programming
die "Invalid intersections" if @intersections % 2 != 0;
###die "Invalid intersections" if @intersections % 2 != 0;
my @lines = ();
while (@intersections) {
# skip tangent points
my @points = map shift @intersections, 1..2;
next if !$points[1];
next if points_coincide(@points);
push @lines, [ @points ];
}