New polygon_is_convex() function

This commit is contained in:
Alessandro Ranellucci 2012-02-25 16:14:59 +01:00
parent 2d130061ed
commit a24ffee2aa
3 changed files with 24 additions and 4 deletions

View File

@ -5,7 +5,7 @@ use warnings;
# an ExPolygon is a polygon with holes # an ExPolygon is a polygon with holes
use Math::Geometry::Voronoi; use Math::Geometry::Voronoi;
use Slic3r::Geometry qw(point_in_polygon X Y A B); use Slic3r::Geometry qw(X Y A B point_in_polygon);
use Slic3r::Geometry::Clipper qw(union_ex JT_MITER); use Slic3r::Geometry::Clipper qw(union_ex JT_MITER);
# the constructor accepts an array of polygons # the constructor accepts an array of polygons

View File

@ -19,7 +19,7 @@ our @EXPORT_OK = qw(
polygon_remove_acute_vertices polygon_remove_parallel_continuous_edges polygon_remove_acute_vertices polygon_remove_parallel_continuous_edges
shortest_path collinear scale unscale merge_collinear_lines shortest_path collinear scale unscale merge_collinear_lines
rad2deg_dir bounding_box_center line_intersects_any douglas_peucker rad2deg_dir bounding_box_center line_intersects_any douglas_peucker
polyline_remove_short_segments normal triangle_normal polyline_remove_short_segments normal triangle_normal polygon_is_convex
); );
use XXX; use XXX;
@ -295,6 +295,15 @@ sub polygon_has_vertex {
return 0; return 0;
} }
sub polygon_is_convex {
my ($points) = @_;
for (my $i = 0; $i <= $#$points; $i++) {
my $angle = angle3points($points->[$i-1], $points->[$i-2], $points->[$i]);
return 0 if $angle < PI;
}
return 1;
}
sub polyline_length { sub polyline_length {
my ($polyline) = @_; my ($polyline) = @_;
my $length = 0; my $length = 0;

View File

@ -2,7 +2,7 @@ use Test::More;
use strict; use strict;
use warnings; use warnings;
plan tests => 17; plan tests => 20;
BEGIN { BEGIN {
use FindBin; use FindBin;
@ -12,7 +12,7 @@ BEGIN {
use Slic3r; use Slic3r;
use Slic3r::Geometry qw(PI polyline_remove_parallel_continuous_edges use Slic3r::Geometry qw(PI polyline_remove_parallel_continuous_edges
polyline_remove_acute_vertices polygon_remove_acute_vertices polyline_remove_acute_vertices polygon_remove_acute_vertices
polygon_remove_parallel_continuous_edges); polygon_remove_parallel_continuous_edges polygon_is_convex);
#========================================================== #==========================================================
@ -144,3 +144,14 @@ is Slic3r::Geometry::can_connect_points(@$points, $polygons), 0, 'can_connect_po
} }
#========================================================== #==========================================================
{
my $cw_square = [ [0,0], [0,10], [10,10], [10,0] ];
is polygon_is_convex($cw_square), 0, 'cw square is not convex';
is polygon_is_convex([ reverse @$cw_square ]), 1, 'ccw square is convex';
my $convex1 = [ [0,0], [10,0], [10,10], [0,10], [0,6], [4,6], [4,4], [0,4] ];
is polygon_is_convex($convex1), 0, 'concave polygon';
}
#==========================================================