EvenlySpaced.pm
上传用户:shbosideng
上传日期:2013-05-04
资源大小:1555k
文件大小:4k
源码类别:

SNMP编程

开发平台:

C/C++

  1. package GIFgraph::EvenlySpaced;
  2. use strict;
  3. use MRP::BaseClass;
  4. use vars qw(@ISA %fields $AUTOLOAD $VERSION);
  5. $VERSION = 1.0;
  6. sub AUTOLOAD {
  7.   my $thing = shift;
  8.   my ($package, $function) = $AUTOLOAD =~ m/^(.*)::([^:]+)$/;
  9.   return if $function eq 'DESTROY';
  10.   if(ref($thing)) {
  11.     return $thing->_DelegateGraph->$function(@_);
  12.   }
  13. #  my $super = join '::', 'SUPER', $function;
  14. #  return $thing->$super(@_);
  15.   die "Could not find $AUTOLOAD via $thing ";
  16. }
  17. sub new {
  18.   my $class = shift;
  19.   my $graph = shift;
  20.   my $self = new MRP::BaseClass;
  21.   $self->rebless($class);
  22.   $self->_DelegateGraph($graph);
  23.   return $self;
  24. }
  25. sub plot {
  26.   my ($self, $data) = @_;
  27.   my $fudge = $self->fudge;
  28.   my @processed;
  29.   my @x = @{$data->[0]};
  30.   my @distances;
  31.   my ($min, $max) = ($x[0], $x[$#x]);
  32.   my $len = $max-$min;
  33.   foreach my $i (1 .. $#x) {
  34.     $distances[$i-1] = $x[$i] - $x[$i-1];
  35.   }
  36.   my @sdist = sort { $a<=>$b } @distances;
  37.   my $sd = shift @sdist;
  38.   while(@sdist) {
  39.     my $nd = shift @sdist;
  40.     my $diff = $nd/$sd;
  41.     $diff = $diff - int($diff);
  42.     $diff = 1-$diff if $diff > 0.5;
  43.     next if $diff < $fudge;
  44.     my $rat = $nd/$sd;
  45.     my $continue = 1;
  46.     for(my $ax = 2; $continue; $ax++) {
  47.       my $yx = $ax*$rat;
  48.       if($yx !~ /./) {
  49. $sd = $nd/$yx;
  50. $continue = 0;
  51.       }
  52.     }
  53.   }
  54.   my $lowest = shift @x;
  55.   my $column = 0;
  56.   for(my $newX = $min; ($newX-$sd) < $max; $newX+=$sd) {
  57.     if($newX >= $lowest) {
  58.       foreach my $series (0 .. $#$data) {
  59. push @{$processed[$series]}, $data->[$series][$column];
  60.       }
  61.       $column++;
  62.       $lowest = shift @x;
  63.     } else {
  64.       foreach my $series (0 .. $#$data) {
  65. push @{$processed[$series]}, undef;
  66.       }
  67.     }
  68.   }
  69.   local $^W = undef;
  70.   return $self->_DelegateGraph->plot(@processed);
  71. }
  72. sub isa {
  73.   my ($thing, $type) = @_;
  74.   return $thing->_DelegateGraph->isa($type) || $thing->SUPER::isa($type);
  75. }
  76. BEGIN {
  77.   @ISA = qw(MRP::BaseClass);
  78.   %fields = (
  79.      fudge => 0.1,
  80.      _DelegateGraph => undef,
  81.     );
  82.   GIFgraph::EvenlySpaced->check4Clashes;
  83. }
  84. $VERSION;
  85. __END__
  86. =head1 NAME
  87. GIFgraph::EvenlySpaced - spaces the data points evenly
  88. =head1 DESCRIPTION
  89. This module wraps a GIFgraph object so that the data points become
  90. numericaly spaced (aproximately).
  91. =head1 SYNOPSIS
  92. Wrapps a GIFgraph object (probably a GIFgraph::lines) so that the x
  93. values are spaced numericaly. Use exactly as your GIFgraph object. Due
  94. to a problem I had with AUTOLOAD, it must be the outer wrapper class.
  95. =head1 Use
  96.   $graph = new GIFgraph::lines(400,300);
  97.   $es = new GIFgraph::EvenlySpaced($graph);
  98. or
  99.   $graph = new GIFgraph::lines(400,300);
  100.   $withmap = new GIFgraph::WithMap($graph);
  101.   $es = new GIFgraph::EvenlySpaced($withmap);
  102. or even
  103.   $es = new GIFgraph::EvenlySpaced(new GIFgraph::WithMap(new GIFgraph::lines(400,300)));
  104. etc. etc. etc.
  105. =head1 Functions
  106. =over
  107. =item new
  108. Returns a new GIFgraph::EvenlySpaced object
  109.   $es = new GIFgraph::EvenlySpaced($parentGraph);
  110. where $parentGraph is any object that behaves like a GIFgraph::lines
  111. type object such as a GIFgraph::WithMap.
  112. =item plot
  113. This function is overridden to space the data numericaly along the
  114. x-axis.
  115. =back
  116. =head1 Fields
  117. =over
  118. =item fudge
  119. This is a fudge factor used in checking whether one number roughly
  120. devides into another. It defaults to 0.1 but if it is obviously doing
  121. silly things then change it. Good luck - I don't realy know how it
  122. works.
  123. =back
  124. =head1 Guts
  125. This module uses MRP::BaseClass to implement member access functions.
  126. To make the 'parent' object behave as if it the super class I have
  127. done some magic with AUTOLOAD. This has produced the restriction that
  128. you can not wrap an EvenlySpaced object inside another - such as
  129. WithMap - that also uses magic.
  130. @ISA does not include the parent type as it is not known. The isa()
  131. method is overridden to account for this.
  132. =head1 AUTHOR
  133. Matthew Pocock mrp@sanger.ac.uk