package Polygon; sub new { bless [@_[1..$#_]], ref $_[0] || $_[0] } sub contains { my( $poly, $x, $y ) = @_; my $wn = 0; my( $x1, $y1 ) = @{ $poly->[-1] }; my( $x2, $y2 ) = @{ $poly->[ 0] }; my $start_over = $y1 >= $y; for ( 1 .. $#{ $poly } ) { my $end_over = $y2 >= $y; if ( $start_over != $end_over ) { if ( ($y2 - $y)*($x2 - $x1) <= ($y2 - $y1)*($x2 - $x) ) { $wn++ if $end_over; } else { $wn-- unless $end_over; } } # if $start_over = $end_over; ( $x1, $y1 ) = ( $x2, $y2 ); ( $x2, $y2 ) = @{ $poly->[$_] }; } # for return $wn != 0; # edit: war vorher $wn == 0, was natürlich falsch ist ;) } # contains