diff options
Diffstat (limited to 'lib/GD/Graph/points.pm')
| -rw-r--r-- | lib/GD/Graph/points.pm | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/lib/GD/Graph/points.pm b/lib/GD/Graph/points.pm new file mode 100644 index 0000000..43b6825 --- /dev/null +++ b/lib/GD/Graph/points.pm @@ -0,0 +1,183 @@ +#========================================================================== +# Copyright (c) 1995-1998 Martien Verbruggen +#-------------------------------------------------------------------------- +# +# Name: +# GD::Graph::points.pm +# +# $Id: points.pm,v 1.13 2003/02/10 22:12:41 mgjv Exp $ +# +#========================================================================== + +package GD::Graph::points; + +($GD::Graph::points::VERSION) = '$Revision: 1.13 $' =~ /\s([\d.]+)/; + +use strict; + +use GD::Graph::axestype; +use GD::Graph::utils qw(:all); + +@GD::Graph::points::ISA = qw( GD::Graph::axestype ); + +# PRIVATE +sub draw_data_set +{ + my $self = shift; + my $ds = shift; + + my @values = $self->{_data}->y_values($ds) or + return $self->_set_error("Impossible illegal data set: $ds", + $self->{_data}->error); + + # Pick a colour + my $dsci = $self->set_clr($self->pick_data_clr($ds)); + my $type = $self->pick_marker($ds); + + for (my $i = 0; $i < @values; $i++) + { + next unless defined $values[$i]; + my ($xp, $yp); + if (defined($self->{x_min_value}) && defined($self->{x_max_value})) + { + ($xp, $yp) = $self->val_to_pixel( + $self->{_data}->get_x($i), $values[$i], $ds); + } + else + { + ($xp, $yp) = $self->val_to_pixel($i+1, $values[$i], $ds); + } + $self->marker($xp, $yp, $type, $dsci ); + $self->{_hotspots}->[$ds]->[$i] = + ['rect', $self->marker_coordinates($xp, $yp)]; + } + + return $ds; +} + +# Pick a marker type + +sub pick_marker # number +{ + my $self = shift; + my $num = shift; + + ref $self->{markers} ? + $self->{markers}[ $num % (1 + $#{$self->{markers}}) - 1 ] : + ($num % 8) || 8; +} + +# Draw a marker + +sub marker_coordinates +{ + my $self = shift; + my ($xp, $yp) = @_; + return ( + $xp - $self->{marker_size}, + $xp + $self->{marker_size}, + $yp + $self->{marker_size}, + $yp - $self->{marker_size}, + ); +} + +sub marker # $xp, $yp, $type, $colourindex +{ + my $self = shift; + my ($xp, $yp, $mtype, $mclr) = @_; + return unless defined $mclr; + + my ($l, $r, $b, $t) = $self->marker_coordinates($xp, $yp); + + MARKER: { + + ($mtype == 1) && do + { # Square, filled + $self->{graph}->filledRectangle($l, $t, $r, $b, $mclr); + last MARKER; + }; + ($mtype == 2) && do + { # Square, open + $self->{graph}->rectangle($l, $t, $r, $b, $mclr); + last MARKER; + }; + ($mtype == 3) && do + { # Cross, horizontal + $self->{graph}->line($l, $yp, $r, $yp, $mclr); + $self->{graph}->line($xp, $t, $xp, $b, $mclr); + last MARKER; + }; + ($mtype == 4) && do + { # Cross, diagonal + $self->{graph}->line($l, $b, $r, $t, $mclr); + $self->{graph}->line($l, $t, $r, $b, $mclr); + last MARKER; + }; + ($mtype == 5) && do + { # Diamond, filled + $self->{graph}->line($l, $yp, $xp, $t, $mclr); + $self->{graph}->line($xp, $t, $r, $yp, $mclr); + $self->{graph}->line($r, $yp, $xp, $b, $mclr); + $self->{graph}->line($xp, $b, $l, $yp, $mclr); + $self->{graph}->fillToBorder($xp, $yp, $mclr, $mclr); + last MARKER; + }; + ($mtype == 6) && do + { # Diamond, open + $self->{graph}->line($l, $yp, $xp, $t, $mclr); + $self->{graph}->line($xp, $t, $r, $yp, $mclr); + $self->{graph}->line($r, $yp, $xp, $b, $mclr); + $self->{graph}->line($xp, $b, $l, $yp, $mclr); + last MARKER; + }; + ($mtype == 7) && do + { # Circle, filled + $self->{graph}->arc($xp, $yp, 2 * $self->{marker_size}, + 2 * $self->{marker_size}, 0, 360, $mclr); + $self->{graph}->fillToBorder($xp, $yp, $mclr, $mclr); + last MARKER; + }; + ($mtype == 8) && do + { # Circle, open + $self->{graph}->arc($xp, $yp, 2 * $self->{marker_size}, + 2 * $self->{marker_size}, 0, 360, $mclr); + last MARKER; + }; + ($mtype == 9) && do + { # Horizontal line + $self->{graph}->line($l, $yp, $r, $yp, $mclr); + last MARKER; + }; + ($mtype == 10) && do + { # vertical line + $self->{graph}->line($xp, $t, $xp, $b, $mclr); + last MARKER; + }; + } +} + +sub draw_legend_marker +{ + my $self = shift; + my $n = shift; + my $x = shift; + my $y = shift; + + my $ci = $self->set_clr($self->pick_data_clr($n)); + + my $old_ms = $self->{marker_size}; + my $ms = _min($self->{legend_marker_height}, $self->{legend_marker_width}); + + ($self->{marker_size} > $ms/2) and $self->{marker_size} = $ms/2; + + $x += int($self->{legend_marker_width}/2); + $y += int($self->{lg_el_height}/2); + + $n = $self->pick_marker($n); + + $self->marker($x, $y, $n, $ci); + + $self->{marker_size} = $old_ms; +} + +"Just another true value"; |
