NAME

Math::Polygon::Tree - fast check if point is inside polygon

VERSION

version 0.08

SYNOPSIS

use Math::Polygon::Tree;

my $poly  = [ [0,0], [0,2], [2,2], ... ];
my $bound = Math::Polygon::Tree->new( $poly );

if ( $bound->contains( [1,1] ) )  { ... }

DESCRIPTION

Math::Polygon::Tree creates a tree of polygon parts for fast check if object is inside this polygon. This method is effective if polygon has hundreds or more segments.

METHODS

new

Takes contours and creates a tree structure. All polygons are outers, inners are not implemented.

Contour is an arrayref of points:

my $poly1 = [ [0,0], [0,2], [2,2], ... ];   
...
my $bound = Math::Polygon::Tree->new( $poly1, $poly2, ..., \%opt );

or a .poly file

my $bound1 = Math::Polygon::Tree->new( \*STDIN );
my $bound2 = Math::Polygon::Tree->new( 'boundary.poly' );

Options:

prepare_rough

contains

my $is_inside = $bound->contains( [1,1] );
if ( $is_inside ) { ... }

Checks if point is inside bound polygon.

Returns 1 if point is inside polygon, -1 if it lays on polygon boundary, or 0 otherwise.

contains_points

# list of points
if ( $bound->contains_points( [1,1], [2,2] ... ) )  { ... }

# arrayref of points
if ( $bound->contains_points( [[1,1], [2,2] ...] ) )  { ... }

Checks if all points are inside or outside polygon.

Returns 1 if all points are inside polygon, 0 if all outside, or undef otherwise.

contains_bbox_rough

my $bbox = [ 1, 1, 2, 2 ];
if ( $bound->contains_bbox_rough( $bbox, \%opt ) )  { ... }

Rough check if box is inside bound polygon.

Returns 1 if box is inside polygon, 0 if box is outside polygon or undef if it 'doubts'.

Options:

inaccurate - allow false positive results

contains_polygon_rough

Checks if polygon is inside bound polygon.

Returns 1 if inside, 0 if outside or undef if 'doubts'.

if ( $bound->contains_polygon_rough( [ [1,1], [1,2], [2,2], ... ] ) )  { ... }

bbox

my $bbox = $bound->bbox();
my ($xmin, $ymin, $xmax, $ymax) = @$bbox;

Returns polygon's bounding box.

FUNCTIONS

read_poly_file

my @contours = read_poly_file( \*STDIN );
my @contours = read_poly_file( 'bound.poly' )

Reads content of .poly-file. See http://wiki.openstreetmap.org/wiki/.poly

polygon_bbox

my $bbox = polygon_bbox( [[1,1], [1,2], [2,2], ... ] );
my ($xmin, $ymin, $xmax, $ymax) = @$bbox;

Returns polygon's bounding box.

bbox_union

my $united_bbox = bbox_union($bbox1, $bbox2);

Returns united bbox for two bboxes/points.

polygon_centroid

my $center_point = polygon_centroid( [ [1,1], [1,2], [2,2], ... ] );

Returns polygon's weightened center.

Math::Polygon 1.02+ has the same function, but it is very inaccurate.

polygon_contains_point

my $is_inside = polygon_contains_point($point, $polygon);

Function that tests if polygon contains point (modified one from Math::Polygon::Calc).

Returns -1 if point lays on polygon's boundary

AUTHOR

liosha <liosha@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2015 by liosha.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.