bars.pm
上传用户:shbosideng
上传日期:2013-05-04
资源大小:1555k
文件大小:4k
- #==========================================================================
- # Copyright (c) 1995-1998 Martien Verbruggen
- #--------------------------------------------------------------------------
- #
- # Name:
- # GIFgraph::bars.pm
- #
- # $Id: bars.pm,v 1.1.1.1 2002/02/26 10:16:37 oetiker Exp $
- #
- #==========================================================================
-
- package GIFgraph::bars;
- use strict qw(vars refs subs);
- use GIFgraph::axestype;
- use GIFgraph::utils qw(:all);
- @GIFgraph::bars::ISA = qw( GIFgraph::axestype );
- my %Defaults = (
-
- # Spacing between the bars
- bar_spacing => 0,
- );
- {
- sub initialise()
- {
- my $self = shift;
- $self->SUPER::initialise();
- my $key;
- foreach $key (keys %Defaults)
- {
- $self->set( $key => $Defaults{$key} );
- }
- }
-
- # PRIVATE
- sub draw_data{
- my $s = shift;
- my $g = shift;
- my $d = shift;
- if ( $s->{overwrite} )
- {
- $s->draw_data_overwrite($g, $d);
- }
- else
- {
- $s->SUPER::draw_data($g, $d);
- }
- # redraw the 'zero' axis
- $g->line(
- $s->{left}, $s->{zeropoint},
- $s->{right}, $s->{zeropoint},
- $s->{fgci} );
- }
-
- # Draws the bars on top of each other
-
- sub draw_data_overwrite {
- my $s = shift;
- my $g = shift;
- my $d = shift;
- my $bar_s = _round($s->{bar_spacing}/2);
- my $zero = $s->{zeropoint};
- my $i;
- for $i (0 .. $s->{numpoints})
- {
- my $bottom = $zero;
- my ($xp, $t);
- my $j;
- for $j (1 .. $s->{numsets})
- {
- next unless (defined $d->[$j][$i]);
- # get data colour
- my $dsci = $s->set_clr( $g, $s->pick_data_clr($j) );
- # get coordinates of top and center of bar
- ($xp, $t) = $s->val_to_pixel($i + 1, $d->[$j][$i], $j);
- # calculate left and right of bar
- my $l = $xp - _round($s->{x_step}/2) + $bar_s;
- my $r = $xp + _round($s->{x_step}/2) - $bar_s;
- # calculate new top
- $t -= ($zero - $bottom) if ($s->{overwrite} == 2);
- # draw the bar
- if ($d->[$j][$i] >= 0)
- {
- # positive value
- $g->filledRectangle( $l, $t, $r, $bottom, $dsci );
- $g->rectangle( $l, $t, $r, $bottom, $s->{acci} );
- }
- else
- {
- # negative value
- $g->filledRectangle( $l, $bottom, $r, $t, $dsci );
- $g->rectangle( $l, $bottom, $r, $t, $s->{acci} );
- }
- # reset $bottom to the top
- $bottom = $t if ($s->{overwrite} == 2);
- }
- }
- }
- sub draw_data_set($$$)
- {
- my $s = shift;
- my $g = shift;
- my $d = shift;
- my $ds = shift;
- my $bar_s = _round($s->{bar_spacing}/2);
- # Pick a data colour
- my $dsci = $s->set_clr( $g, $s->pick_data_clr($ds) );
- my $i;
- for $i (0 .. $s->{numpoints})
- {
- next unless (defined $d->[$i]);
- # get coordinates of top and center of bar
- my ($xp, $t) = $s->val_to_pixel($i + 1, $d->[$i], $ds);
- # calculate left and right of bar
- my ($l, $r);
- if ($s->{mixed})
- {
- $l = $xp - _round($s->{x_step}/2) + $bar_s;
- $r = $xp + _round($s->{x_step}/2) - $bar_s;
- }
- else
- {
- $l = $xp
- - _round($s->{x_step}/2)
- + _round(($ds - 1) * $s->{x_step}/$s->{numsets})
- + $bar_s;
- $r = $xp
- - _round($s->{x_step}/2)
- + _round($ds * $s->{x_step}/$s->{numsets})
- - $bar_s;
- }
- # draw the bar
- if ($d->[$i] >= 0)
- {
- # positive value
- $g->filledRectangle( $l, $t, $r, $s->{zeropoint}, $dsci );
- $g->rectangle( $l, $t, $r, $s->{zeropoint}, $s->{acci} );
- }
- else
- {
- # negative value
- $g->filledRectangle( $l, $s->{zeropoint}, $r, $t, $dsci );
- $g->rectangle( $l, $s->{zeropoint}, $r, $t, $s->{acci} );
- }
- }
- }
-
- } # End of package GIFgraph::bars
- 1;