#!/usr/bin/perl use 5.010; use strict; use warnings; use GD; use AI::Termites; use Getopt::Long; my $world = 1; my $specie = 'NemusNidor'; my $termites = 20; my $wood = 200; my $near; my $one_of = 5; my $width = 1024; my $dim = 2; my $taken = 0; my $output = "output"; my $truecolor = 0; my $top = 0; my $result = GetOptions( "world-size=s" => \$world, "specie=s" => \$specie, "termites=i" => \$termites, "wood=i" => \$wood, "near=s" => \$near, "one-of=i" => \$one_of, "width=i" => \$width, "dim=i" => \$dim, "taken" => \$taken, "output=s" => \$output, "truecolor" => \$truecolor, "top=i" => \$top, ); sub scl { my $p = shift; @{$width * $p}[0, 1]; } sub sscl { my $s = shift; $width * $s; } $| = 1; my $class = "AI::Termites::$specie"; eval "require $class; 1" or die "unable to load $class: $@"; my $ters = $class->new(dim => $dim, world_size => $world, n_wood => $wood, n_termites => $termites, near => $near); my $n = 0; my $fn = 0; while (1) { my $im = GD::Image->new($width, $width, $truecolor); my $white = $im->colorAllocate(255,255,255); $im->filledRectangle(0, 0, $width, $width, $white); my $black = $im->colorAllocate(0, 0, 0); # $im->interlaced('true'); my $red = $im->colorAllocate(255, 0, 0); my $blue = $im->colorAllocate(0, 0, 255); my $orange = $im->colorAllocate(255, 128, 0); my $green = $im->colorAllocate(0, 255, 0); my $txt = sprintf ("dim: %d, near: %.2f%%, termites: %d, wood: %d, wood taken: %d, iteration %d", $dim, 100 * $ters->{near} / $world, $termites, $wood, $ters->{taken}, $n ); $im->string(gdSmallFont, 4, 4, $txt, $black); for my $wood (@{$ters->{wood}}) { if ($wood->{taken}) { $taken and $im->filledEllipse(scl($wood->{pos}), 8, 8, $orange); } else { $im->filledEllipse(scl($wood->{pos}), 5, 5, $blue); } } for my $ter (@{$ters->{termites}}) { my $color = (defined($ter->{wood_ix}) ? $red : $green); $im->filledEllipse(scl($ter->{pos}), 3, 3, $color); } my $name = sprintf "%s-%05d.png", $output, $fn; open my $fh, ">", $name; print $fh $im->png; close $fh; print "$n ($fn)\r"; for (1..$one_of) { $n++; $ters->iterate; } $fn++; last if ($top and $n > $top); } __END__ =head1 NAME termites.pl - Artificial Termites =head1 SYNOPSIS termites.pl [OPTIONS] =head1 DESCRIPTION This script runs the Artificial Termites simulation provided by the Perl module L. The accepted options are as follows: =over =item --dim N Number of dimensions of the world. Defaults to 2. =item --world-size SIZE The size of the world box, Defaults to 1. =item --specie NAME The name of the artificial termite subspecie to simulate. The currently accepted ones are C, C, C and C. =item --wood N Piezes of wood in the simulated world. =item --termites N Number of termites in the simulated world. =item --near SIZE The size of the boll that a termite will consider as its neighborhood. Defaults to 1/50 of the world size. Every specie uses this parameter in a different way. =item --taken Represent on the drawings the pieces of wood that are actually being moved by some termite. =item --output FILENAME Prefix used for the file names of the generated PNGs. Defaults to C. =item --one-of N Save to file one of every N frames. Defaults to 5. =item --top N Exit the application when the number of iterations reachs the given number. =item --width W Number of pixels of the generated images. Defaults to 1024. =item --truecolor Generate TrueColor PNGs. The default PNG format uses a 8bit indexed palette that is not correctly handled by some programs as ffmpeg or mencoder. =back =head1 EXAMPLES termites.pl --specie=VicinusOccurro --truecolor --output vo --one-of 1 --top 10000 termites.pl --specie=PeractioBaro --one-of 10 --near 0.02 --taken --dim 2 \ --truecolor --output pb --top 40000 =head1 MAKING MOVIES In order to convert a set of PNGs into an animation, ffmpeg can be used as follows: ffmpeg -i output-%05d.png video.mpg =head1 SEE ALSO The idea about artificial termites comes from the book "Adventures in Modeling" by Vanessa Stevens Colella, Eric Klopfer and Mitchel Resnick (L). An online Artificial Termites simulation can be found here: L. The origin of this module lies on the following PerlMonks post: L. =head1 COPYRIGHT AND LICENSE Copyright (C) 2011 by Salvador FandiEo, Esfandino@yahoo.comE This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.12.3 or, at your option, any later version of Perl 5 you may have available. =cut