|
/home/cpanrun/depot/main/contrib-patched/perl/CPAN/src/AI-NNFlex/blib/lib/AI/NNFlex/draw.pm |
simple network diagram routine. syntax:
my $gif = AI::NNFlex::draw->network($network,{'type'=>'png/GIF'});
Returns a GIF/png object. This is the first tentative step towards a GUI control for the bundle;
NB: the diagram returned displays the activation of the node as a red circle inside the green circle. Copyright (c) 2004-2005 Charles Colbourn. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut ############################################################### # # ############################################################### use strict; use GD;
sub network { shift; my $network = shift; my $params = shift; my %config = %$params;
my @nodeList;
$network->dbug("Entered AI::NNFlex::draw with network $network",6);
# I nicked this code from my ldapmonitor script, so there could
# be ldap variables lurking in here
my $numberOfLayers = scalar @{$network->{'layers'}};
my $maxNodes;
foreach (@{$network->{'layers'}})
{
if (scalar @{$_->{'nodes'}} > $maxNodes)
{
$maxNodes = scalar @{$_->{'nodes'}};
}
}
# Find out how many nodes in each layer, and allow space for the most
my ($imageHeight,$imageHeightFactor,$imageWidth,$imageWidthFactor);
$imageHeightFactor = $maxNodes;
$imageHeight +=40; # to allow 20 pixels around the outside
$imageHeight += $imageHeightFactor*40; # to allow 40 pixels per node
$imageHeight += (80 * ($imageHeightFactor -1)); # allow 60 pixels between nodes
$imageWidthFactor = $numberOfLayers;
# space the layers out more when there are large numbers of nodes
# otherwise fill doesn't work properly and you end up with a solid
# block of colour
$imageWidthFactor = $imageWidthFactor *($imageHeightFactor/4);
$imageWidth +=40; # to allow 20 pixels around the outside
$imageWidth += $imageWidthFactor*40; # to allow 40 pixels per node
$imageWidth += (80 * ($imageWidthFactor -1)); # allow 60 pixels between nodes
$network->dbug("Image height=$imageHeight, width=$imageWidth",6);
my $image = new GD::Image($imageWidth,$imageHeight);
my $white = $image->colorAllocate(255,255,255);
my $black = $image->colorAllocate(0,0,0);
my $red = $image->colorAllocate(255,0,0);
my $green = $image->colorAllocate(51,204,102);
my $grey = $image->colorAllocate(190,190,190);
$image->transparent($white);
# Allocate a location to each node
my %nodeCoords;
my $currentLocationX = 40;
my $currentLocationY = 0;
foreach my $layer(@{$network->{'layers'}})
{
my $divisor = scalar (@{$layer->{'nodes'}});
foreach my $node (@{$layer->{'nodes'}})
{
$currentLocationY += (($imageHeight)/($divisor+1));
$nodeCoords{$node} = [$currentLocationX,$currentLocationY];
push @nodeList,$node;
}
#$currentLocationX += 60;
$currentLocationX += 60 * ($imageWidthFactor/$numberOfLayers);
$currentLocationY=0;
}
# Print the nodes on the picture
foreach my $node (@nodeList)
{
$network->dbug("Drawing node $node at ${$nodeCoords{$node}}[0],${$nodeCoords{$node}}[1]",6);
if ($node->{'active'})
{
$image->arc(${$nodeCoords{$node}}[0],${$nodeCoords{$node}}[1],40,40,0,360,$green);
$image->fill(${$nodeCoords{$node}}[0],${$nodeCoords{$node}}[1],$green);
}
else
{
$image->arc(${$nodeCoords{$node}}[0],${$nodeCoords{$node}}[1],40,40,0,360,$grey);
$image->fill(${$nodeCoords{$node}}[0],${$nodeCoords{$node}}[1],$grey);
}
}
foreach my $node (@nodeList)
{
foreach my $connectedNode (@{$node->{'connectedNodesWest'}->{'nodes'}})
{
if ($node->{'active'} && $connectedNode->{'active'})
{
#Forget the weights for the moment
$image->line(${$nodeCoords{$node}}[0],${$nodeCoords{$node}}[1],${$nodeCoords{$connectedNode}}[0], ${$nodeCoords{$connectedNode}}[1],$green);
}
}
}
# apply the activation
foreach my $node (@nodeList)
{
my $activation;
$activation = $node->{'activation'};
$network->dbug("Node $node activation $activation",6);
if ($activation > 1){$activation = 1};
if ($activation < 0){$activation = 0};
if ($node->{'active'})
{
$network->dbug("Node $node adjusted activation $activation",6);
$image->arc(${$nodeCoords{$node}}[0],${$nodeCoords{$node}}[1],40*$activation,40*$activation,0,360,$red);
$image->fillToBorder(${$nodeCoords{$node}}[0],${$nodeCoords{$node}}[1],$red,$red);
}
}
$network->dbug("Returning image $image",6);
if (uc($config{'type'}) eq "GIF"){return $image->gif};
if (uc($config{'type'}) eq "PNG"){return $image->png};
# return gif by default
return $image->gif;
}
1;
|
/home/cpanrun/depot/main/contrib-patched/perl/CPAN/src/AI-NNFlex/blib/lib/AI/NNFlex/draw.pm |