#==========================================================================
# Copyright (c) 1995-1998 Martien Verbruggen
#--------------------------------------------------------------------------
#
# Name:
# GIFgraph::points.pm
#
# $Id: points.pm,v 1.1.1.1 2002/02/26 10:16:37 oetiker Exp $
#
#==========================================================================
package GIFgraph::points;
use strict qw(vars refs subs);
use GIFgraph::axestype;
use GIFgraph::utils qw(:all);
@GIFgraph::points::ISA = qw( GIFgraph::axestype );
my %Defaults = (
# The size of the marker to use in the points and linespoints graphs
# in pixels
marker_size => 4,
);
{
sub initialise()
{
my $s = shift;
$s->SUPER::initialise();
my $key;
foreach $key (keys %Defaults)
{
$s->set( $key => $Defaults{$key} );
}
}
# PRIVATE
sub draw_data_set($$$) # GD::Image, \@data
{
my $s = shift;
my $g = shift;
my $d = shift;
my $ds = shift;
# Pick a colour
my $dsci = $s->set_clr( $g, $s->pick_data_clr($ds) );
my $type = $s->pick_marker($ds);
my $i;
for $i (0 .. $s->{numpoints})
{
next unless (defined $d->[$i]);
my ($xp, $yp) = $s->val_to_pixel($i+1, $d->[$i], $ds);
$s->marker( $g, $xp, $yp, $type, $dsci );
}
}
# Pick a marker type
sub pick_marker($) # number
{
my $s = shift;
my $num = shift;
if ( exists $s->{markers} )
{
return $s->{markers}[ $num % (1 + $#{$s->{markers}}) - 1 ];
}
return ($num % 8) || 8;
}
# Draw a marker
sub marker($$$$$) # $graph, $xp, $yp, type (1-7), $colourindex
{
my $self = shift;
my ($graph, $xp, $yp, $mtype, $mclr) = @_;
my $l = $xp - $self->{marker_size};
my $r = $xp + $self->{marker_size};
my $b = $yp + $self->{marker_size};
my $t = $yp - $self->{marker_size};
MARKER: {
($mtype == 1) && do
{ # Square, filled
$graph->filledRectangle( $l, $t, $r, $b, $mclr );
last MARKER;
};
($mtype == 2) && do
{ # Square, open
$graph->rectangle( $l, $t, $r, $b, $mclr );
last MARKER;
};
($mtype == 3) && do
{ # Cross, horizontal
$graph->line( $l, $yp, $r, $yp, $mclr );
$graph->line( $xp, $t, $xp, $b, $mclr );
last MARKER;
};
($mtype == 4) && do
{ # Cross, diagonal
$graph->line( $l, $b, $r, $t, $mclr );
$graph->line( $l, $t, $r, $b, $mclr );
last MARKER;
};
($mtype == 5) && do
{ # Diamond, filled
$graph->line( $l, $yp, $xp, $t, $mclr );
$graph->line( $xp, $t, $r, $yp, $mclr );
$graph->line( $r, $yp, $xp, $b, $mclr );
$graph->line( $xp, $b, $l, $yp, $mclr );
$graph->fillToBorder( $xp, $yp, $mclr, $mclr );
last MARKER;
};
($mtype == 6) && do
{ # Diamond, open
$graph->line( $l, $yp, $xp, $t, $mclr );
$graph->line( $xp, $t, $r, $yp, $mclr );
$graph->line( $r, $yp, $xp, $b, $mclr );
$graph->line( $xp, $b, $l, $yp, $mclr );
last MARKER;
};
($mtype == 7) && do
{ # Circle, filled
$graph->arc( $xp, $yp, 2 * $self->{marker_size},
2 * $self->{marker_size}, 0, 360, $mclr );
$graph->fillToBorder( $xp, $yp, $mclr, $mclr );
last MARKER;
};
($mtype == 8) && do
{ # Circle, open
$graph->arc( $xp, $yp, 2 * $self->{marker_size},
2 * $self->{marker_size}, 0, 360, $mclr );
last MARKER;
};
}
}
sub draw_legend_marker($$$$) # (GD::Image, data_set_number, x, y)
{
my $s = shift;
my $g = shift;
my $n = shift;
my $x = shift;
my $y = shift;
my $ci = $s->set_clr( $g, $s->pick_data_clr($n) );
my $old_ms = $s->{marker_size};
my $ms = _min($s->{legend_marker_height}, $s->{legend_marker_width});
($s->{marker_size} > $ms/2) and $s->{marker_size} = $ms/2;
$x += int($s->{legend_marker_width}/2);
$y += int($s->{lg_el_height}/2);
$n = $s->pick_marker($n);
$s->marker($g, $x, $y, $n, $ci);
$s->{marker_size} = $old_ms;
}
} # End of package GIFgraph::Points
1;