Algorithm-Evolutionary
view release on metacpan or search on metacpan
lib/Algorithm/Evolutionary/Op/Animated_GIF_Output.pm view on Meta::CPAN
package Algorithm::Evolutionary::Op::Animated_GIF_Output;
use lib qw( ../../../../lib
../../../lib
../../../../../../Algorithm-Evolutionary/lib ../Algorithm-Evolutionary/lib ); #For development and perl syntax mode
use warnings;
use strict;
use Carp;
our $VERSION = sprintf "%d.%03d", q$Revision: 1.5 $ =~ /(\d+)\.(\d+)/g;
use base 'Algorithm::Evolutionary::Op::Base';
use GD::Image;
sub new {
my $class = shift;
my $hash = shift || croak "No default values for length ";
my $self = Algorithm::Evolutionary::Op::Base::new( __PACKAGE__, 1, $hash );
$hash->{'pixels_per_bit'} = $hash->{'pixels_per_bit'} || 1;
$self->{'_image'} = GD::Image->new($hash->{'length'}*$hash->{'pixels_per_bit'},
$hash->{'number_of_strings'}*$hash->{'pixels_per_bit'});
$self->{'_length'} = $hash->{'length'};
$self->{'_pixels_per_bit'} = $hash->{'pixels_per_bit'};
$self->{'_white'} = $self->{'_image'}->colorAllocate(0,0,0); #background color
$self->{'_black'} = $self->{'_image'}->colorAllocate(255,255,255);
$self->{'_gifdata'} = $self->{'_image'}->gifanimbegin;
$self->{'_gifdata'} .= $self->{'_image'}->gifanimadd; # first frame
return $self;
}
sub apply {
my $self = shift;
my $population_hashref=shift;
my $frame = GD::Image->new($self->{'_image'}->getBounds);
my $ppb = $self->{'_pixels_per_bit'};
my $l=0;
for my $i (@$population_hashref) {
my $bit_string = $i->{'_str'};
for my $c ( 0..($self->{'_length'}-1) ) {
my $bit = substr( $bit_string, $c, 1 );
if ( $bit ) {
for my $p ( 1..$ppb ) {
for my $q (1..$ppb ) {
$frame->setPixel($l*$ppb+$q, $c*$ppb+$p,
$self->{'_black'})
}
}
}
}
$l++;
}
$self->{'_gifdata'} .= $frame->gifanimadd; # add frame
}
sub terminate {
my $self= shift;
$self->{'_gifdata'} .= $self->{'_image'}->gifanimend;
}
sub output {
my $self = shift;
return $self->{'_gifdata'};
}
"No man's land" ; # Magic true value required at end of module
__END__
=head1 NAME
Algorithm::Evolutionary::Op::Animated_GIF_Output - Creates an animated GIF, a frame per generation. Useful for binary strings.
=head1 SYNOPSIS
my $pp = new Algorithm::Evolutionary::Op::Animated_GIF_Output;
my @pop;
my $length = 8;
my $number_of_strings = 10;
for ( 1..$number_of_strings ) {
my $indi= new Algorithm::Evolutionary::Individual::String [0,1], $length;
push @pop, $indi;
( run in 1.284 second using v1.01-cache-2.11-cpan-0d23b851a93 )