1
# Copyrights 2004,2006-2009 by Mark Overmeer.
2
# For other contributors see ChangeLog.
3
# See the manual pages for details on the licensing terms.
4
# Pod stripped from pm file by OODoc 1.06.
8
package Math::Polygon::Surface;
17
my $class = ref $thing || $thing;
23
{ if(!ref $_[0]) { my $k = shift; $options{$k} = shift }
24
elsif(ref $_[0] eq 'ARRAY') {push @poly, shift}
25
elsif($_[0]->isa('Math::Polygon')) {push @poly, shift}
26
else { die "Illegal argument $_[0]" }
29
$options{_poly} = \@poly if @poly;
30
(bless {}, $class)->init(\%options);
34
{ my ($self, $args) = @_;
38
{ ($outer, @inner) = @{$args->{_poly}};
41
{ $outer = $args->{outer}
42
or die "ERROR: surface requires outer polygon\n";
44
@inner = @{$args->{inner}} if defined $args->{inner};
47
foreach ($outer, @inner)
48
{ next unless ref $_ eq 'ARRAY';
49
$_ = Math::Polygon->new(points => $_);
52
$self->{MS_outer} = $outer;
53
$self->{MS_inner} = \@inner;
58
sub outer() { shift->{MS_outer} }
61
sub inner() { @{shift->{MS_inner}} }
64
sub bbox() { shift->outer->bbox }
69
my $area = $self->outer->area;
70
$area -= $_->area for $self->inner;
77
my $per = $self->outer->perimeter;
78
$per += $_->perimeter for $self->inner;
84
{ my ($self, @bbox) = @_;
85
map { $_->lineClip(@bbox) } $self->outer, $self->inner;
90
{ my ($self, @bbox) = @_;
91
my $outer = $self->outer->fillClip1(@bbox);
92
return () unless defined $outer;
96
, inner => [ map {$_->fillClip1(@bbox)} $self->inner ]
105
, $self->outer->string
106
, map {$_->string } $self->inner)