package Image::WMF::Polygon;
use strict;
use vars qw($VERSION $DEBUG);
$VERSION = "1.00";
$DEBUG = 0;
sub new {
my ($class) = shift;
my @vertices = @_;
my $obj = bless {
_vertices => [],
_xvertices => [],
_yvertices => [],
_numvertices => 0,
}, $class;
$obj->_initialise(@vertices);
return $obj;
}
sub addPt {
my ($self,$x,$y) = @_;
unless (defined $x && defined $y){
die("Cannot create polygon: x/y vertex coordinate number mismatch\n");
}
push (@{$self->{'_xvertices'}},$x);
push (@{$self->{'_yvertices'}},$y);
push (@{$self->{'_vertices'}},$x);
push (@{$self->{'_vertices'}},$y);
$self->{'_numvertices'}++;
print STDERR "Added polygon vertex ",$self->{'_numvertices'},"\n" if $DEBUG;
}
sub getPt {
my ($self,$p) = @_;
return($self->{'_xvertices'}->[$p],$self->{'_yvertices'}->[$p]);
}
sub toPt {
my ($self,$x,$y) = @_;
$self->addPt($x,$y);
}
sub setPt {
my ($self,$p,$x,$y) = @_;
$self->{'_xvertices'}->[$p] = $x;
$self->{'_yvertices'}->[$p] = $y;
}
sub vertices {
my ($self) = @_;
return(@{$self->{'_vertices'}});
}
sub _xvertices {
my ($self) = @_;
return($self->{'_xvertices'});
}
sub _yvertices {
my ($self) = @_;
return($self->{'_yvertices'});
}
sub length {
my ($self) = @_;
return($self->{'_numvertices'});
}
sub bounds {
my $self = shift;
my($top,$bottom,$left,$right) = @_;
$top = 99999999;
$bottom =-99999999;
$left = 99999999;
$right = -99999999;
my $v;
for (my $v=0; $v < scalar(@$self->_vertices);$v++) {
$left = $self->{'_xvertices'}->[$v] if $left > $self->{'_xvertices'}->[$v];
$right = $self->{'_xvertices'}->[$v] if $right < $self->{'_xvertices'}->[$v];
$top = $self->{'_yvertices'}->[$v] if $top > $self->{'_yvertices'}->[$v];
$bottom = $self->{'_yvertices'}->[$v] if $bottom < $self->{'_yvertices'}->[$v];
}
return ($left,$top,$right,$bottom);
}
sub offset {
my($self,$dh,$dv) = @_;
my $size = $self->length();
my($i);
for ($i=0;$i<$size;$i++) {
my($x,$y)=$self->getPt($i);
$self->setPt($i,$x+$dh,$y+$dv);
}
}
sub delete { # think this is bugged
my($self,$index) = @_;
my($xvertex) = splice(@{$self->{'_xvertices'}},$index,1);
my($yvertex) = splice(@{$self->{'_yvertices'}},$index,1);
return ($xvertex,$yvertex);
}
sub map {
my($self,$srcL,$srcT,$srcR,$srcB,$destL,$destT,$destR,$destB) = @_;
my($factorV) = ($destB-$destT)/($srcB-$srcT);
my($factorH) = ($destR-$destL)/($srcR-$srcL);
my($vertices) = $self->length;
my($i);
for ($i=0;$i<$vertices;$i++) {
my($x,$y) = $self->getPt($i);
$x = int($destL + ($x - $srcL) * $factorH);
$y = int($destT + ($y - $srcT) * $factorV);
$self->setPt($i,$x,$y);
}
}
sub transform($$$$$$$) {
# see PostScript Ref. page 154
my($self, $a, $b, $c, $d, $tx, $ty) = @_;
my $size = $self->length;
for (my $i=0;$i<$size;$i++) {
my($x,$y)=$self->getPt($i);
$self->setPt($i, $a*$x+$c*$y+$tx, $b*$x+$d*$y+$ty);
}
}
sub scale {
my($self, $sx, $sy) = @_;
$self->transform($sx,0,0,$sy,0,0);
}
sub _initialise {
my ($self) = shift;
}
1;