PHP interesse |
|
Hallo,
Ik ben bezig met een grafieken-classje waarmee je verschillende soorten grafieken kunt genereren (doh). Maar het werkt niet helemaal, en wel bij het aanmaken van het 3d effect bij de taartgrafieken.
Dit is de code om het grafiek te genereren (misschien wel totaal onlogisch of whatever, maar het werkt (tot nu toe.. ).
<?php
function taartgrafiek( $conf, $input )
{
if ( is_array( $conf ) AND is_array( $input ) )
{
## Genereer het plaatje ##
$grafiek = imagecreate( $conf [ 'width' ], $conf[ 'height' ] );
$achtergr = imagecolorallocate( $grafiek, 0xFF, 0xFF, 0xFF );
## Loop de hele input array door om het totaal te weten te komen ##
$totaal = 0;
for( $a = 0; $a <= count( $input ); $a++ )
$totaal += $input[ $a ][ 1 ];
## Kleuren ##
$zwart = imagecolorallocate( $grafiek, 0x00, 0x00, 0x00 );
$grijs = imagecolorallocate( $grafiek, 0xEE, 0xEE, 0xEE );
$rood = imagecolorallocate( $grafiek, 0xFF, 0x00, 0x00 );
$dgrijs = imagecolorallocate( $grafiek, 0xAD, 0xAD, 0xAD );
$wit = imagecolorallocate( $grafiek, 0xFF, 0xFF, 0xFF );
## Rekening houden met de legenda ##
if( $conf[ 'legenda' ] )
$conf[ 'max_width' ] = ($conf[ 'width' ]-160);
else
$conf[ 'max_width' ] = $conf[ 'width' ];
## Randen om het gehele gebied ##
if( $conf[ 'randen' ] )
{
imageline($grafiek, 0, 0, $conf[ 'width' ], 0, $zwart);
imageline($grafiek, 0, 0, 0, $conf[ 'height' ], $zwart);
imageline($grafiek, ( $conf[ 'width' ]-1 ), 0, ($conf[ 'width' ]-1), $conf[ 'height' ], $zwart);
imageline($grafiek, 0, ($conf[ 'height' ]-1), $conf[ 'width' ], ($conf[ 'height' ]-1), $zwart);
}
# Grafiek titel #
imagestring( $grafiek, 6, ($conf[ 'width' ]/2)-(strlen( $conf[ 'titel' ] )*7), 7, $conf[ 'titel' ] , $zwart );
## Het grafiekgebied omlijnen en vullen met grid ##
if( $conf[ 'randen' ] )
{
$eraf = (($conf[ 'max_width' ]-$conf[ 'grootte' ])/2)-5;
imageline( $grafiek, $eraf, 30, $conf[ 'max_width' ]-$eraf, 30, $dgrijs );
imageline( $grafiek, $eraf, $conf[ 'height' ]-30, $conf[ 'max_width' ]-$eraf, $conf[ 'height' ]-30, $dgrijs );
imageline( $grafiek, $eraf, 30, $eraf, $conf[ 'height' ]-30, $dgrijs );
imageline( $grafiek, ($conf[ 'max_width' ]-$eraf), 30,($conf[ 'max_width' ]-$eraf), ($conf[ 'height' ]-30), $dgrijs );
}
## Het grafiekgebied vullen het grid ##
if( $conf[ 'grid' ] > 0 )
{
for( $h = 0; $h <= ($conf[ 'height' ]-60); $h = $h+$conf[ 'grid' ] )
imageline( $grafiek, $eraf+1, 29+$h, $conf[ 'max_width' ]-$eraf-2, 29+$h, $grijs );
for( $v = 0; $v <= ($conf[ 'max_width' ]-($eraf*2)-2); $v = $v + $conf[ 'grid' ] )
imageline( $grafiek, (1+$eraf+$v), 31, (1+$eraf+$v), $conf[ 'height' ]-31, $grijs );
}
if( $conf[ '3d' ] )
{
for( $i = 0; $i <= count( $input )-1; $i++ )
{
## Procenten berekenen ##
$procent = (($input[ $i ][ 1 ])*(100/$totaal));
## En naar graden ##
$graden = ((360/100)*($procent));
$graden = $laatste_graad+$graden;
## Kleuren ##
$kleur[ $i ][ 'licht' ] = imagecolorallocate( $grafiek, $this->pie[ 'l' ][ $i ][ 0 ], $this->pie[ 'l' ][ $i ][ 1 ], $this->pie[ 'l' ][ $i ][ 2 ] );
$kleur[ $i ][ 'donker' ] = imagecolorallocate( $grafiek, $this->pie[ 'd' ][ $i ][ 0 ], $this->pie[ 'd' ][ $i ][ 1 ], $this->pie[ 'd' ][ $i ][ 2 ] );
for( $a = 1; $a<=30; $a++ )
imagefilledarc($grafiek, ($conf[ 'max_width' ]/2), ($conf[ 'height' ]/2)+$a, $conf[ 'grootte' ], ($conf[ 'grootte' ]/2), $laatste_graad, $graden, $kleur[ $i ][ 'donker' ], IMG_ARC_PIE);
$laatste_graad = $graden;
$step = $step+$stap;
}
}
$laatste_graad = 0; $stap = 40; $step = 0;
for( $i = 0; $i <= count( $input )-1; $i++ )
{
## Procenten berekenen ##
$procent = (($input[ $i ][ 1 ])*(100/$totaal));
## En naar graden ##
$graden = ((360/100)*($procent));
$graden = $laatste_graad+$graden;
## Kleuren ##
$kleur[ $i ][ 'licht' ] = imagecolorallocate( $grafiek, $this->pie[ 'l' ][ $i ][ 0 ], $this->pie[ 'l' ][ $i ][ 1 ], $this->pie[ 'l' ][ $i ][ 2 ] );
$kleur[ $i ][ 'donker' ] = imagecolorallocate( $grafiek, $this->pie[ 'd' ][ $i ][ 0 ], $this->pie[ 'd' ][ $i ][ 1 ], $this->pie[ 'd' ][ $i ][ 2 ] );
imagefilledarc($grafiek, ($conf[ 'max_width' ]/2), ($conf[ 'height' ]/2), $conf[ 'grootte' ], ($conf[ 'grootte' ]/2), $laatste_graad, $graden, $kleur[ $i ][ 'licht' ], IMG_ARC_PIE);
if( $conf[ 'legenda' ] )
{
imagefilledrectangle( $grafiek, $conf[ 'max_width' ], (50+$step), $conf[ 'max_width' ]+15, (65+$step), $kleur[ $i ][ 'donker' ] );
imagestring( $grafiek, 2, $conf[ 'max_width' ]+20, 50+$step, $input[ $i ][ 0 ], $zwart );
}
$laatste_graad = $graden;
$step = $step+$stap;
}
## Copyright ##
if( $conf[ 'copyright' ] )
imagestring( $grafiek, 1, 3, 3, $conf[ 'copyright' ], $dgrijs );
## Maak het grafiek ##
imagepng( $grafiek );
imagedestroy( $grafiek );
}
else
return;
}
?>
<?php function taartgrafiek( $conf, $input ) { { ## Genereer het plaatje ## $grafiek = imagecreate( $conf [ 'width' ], $conf[ 'height' ] ); $achtergr = imagecolorallocate( $grafiek, 0xFF, 0xFF, 0xFF ); ## Loop de hele input array door om het totaal te weten te komen ## $totaal = 0; for( $a = 0; $a <= count( $input ); $a++ ) $totaal += $input[ $a ][ 1 ]; ## Kleuren ## $zwart = imagecolorallocate( $grafiek, 0x00, 0x00, 0x00 ); $grijs = imagecolorallocate( $grafiek, 0xEE, 0xEE, 0xEE ); $rood = imagecolorallocate( $grafiek, 0xFF, 0x00, 0x00 ); $dgrijs = imagecolorallocate( $grafiek, 0xAD, 0xAD, 0xAD ); $wit = imagecolorallocate( $grafiek, 0xFF, 0xFF, 0xFF ); ## Rekening houden met de legenda ## if( $conf[ 'legenda' ] ) $conf[ 'max_width' ] = ($conf[ 'width' ]-160); else $conf[ 'max_width' ] = $conf[ 'width' ]; ## Randen om het gehele gebied ## if( $conf[ 'randen' ] ) { imageline($grafiek, 0, 0, $conf[ 'width' ], 0, $zwart); imageline($grafiek, 0, 0, 0, $conf[ 'height' ], $zwart); imageline($grafiek, ( $conf[ 'width' ]-1 ), 0, ($conf[ 'width' ]-1), $conf[ 'height' ], $zwart); imageline($grafiek, 0, ($conf[ 'height' ]-1), $conf[ 'width' ], ($conf[ 'height' ]-1), $zwart); } # Grafiek titel # imagestring ( $grafiek, 6, ($conf[ 'width' ]/2)-(strlen( $conf[ 'titel' ] )*7), 7, $conf[ 'titel' ] , $zwart ); ## Het grafiekgebied omlijnen en vullen met grid ## if( $conf[ 'randen' ] ) { $eraf = (($conf[ 'max_width' ]-$conf[ 'grootte' ])/2)-5; imageline( $grafiek, $eraf, 30, $conf[ 'max_width' ]-$eraf, 30, $dgrijs ); imageline( $grafiek, $eraf, $conf[ 'height' ]-30, $conf[ 'max_width' ]-$eraf, $conf[ 'height' ]-30, $dgrijs ); imageline( $grafiek, $eraf, 30, $eraf, $conf[ 'height' ]-30, $dgrijs ); imageline( $grafiek, ($conf[ 'max_width' ]-$eraf), 30,($conf[ 'max_width' ]-$eraf), ($conf[ 'height' ]-30), $dgrijs ); } ## Het grafiekgebied vullen het grid ## if( $conf[ 'grid' ] > 0 ) { for( $h = 0; $h <= ($conf[ 'height' ]-60); $h = $h+$conf[ 'grid' ] ) imageline( $grafiek, $eraf+1, 29+$h, $conf[ 'max_width' ]-$eraf-2, 29+$h, $grijs ); for( $v = 0; $v <= ($conf[ 'max_width' ]-($eraf*2)-2); $v = $v + $conf[ 'grid' ] ) imageline( $grafiek, (1+$eraf+$v), 31, (1+$eraf+$v), $conf[ 'height' ]-31, $grijs ); } if( $conf[ '3d' ] ) { for( $i = 0; $i <= count( $input )-1; $i++ ) { ## Procenten berekenen ## $procent = (($input[ $i ][ 1 ])*(100/$totaal)); ## En naar graden ## $graden = ((360/100)*($procent)); $graden = $laatste_graad+$graden; ## Kleuren ## $kleur[ $i ][ 'licht' ] = imagecolorallocate( $grafiek, $this->pie[ 'l' ][ $i ][ 0 ], $this->pie[ 'l' ][ $i ][ 1 ], $this->pie[ 'l' ][ $i ][ 2 ] ); $kleur[ $i ][ 'donker' ] = imagecolorallocate( $grafiek, $this->pie[ 'd' ][ $i ][ 0 ], $this->pie[ 'd' ][ $i ][ 1 ], $this->pie[ 'd' ][ $i ][ 2 ] ); for( $a = 1; $a<=30; $a++ ) imagefilledarc($grafiek, ($conf[ 'max_width' ]/2), ($conf[ 'height' ]/2)+$a, $conf[ 'grootte' ], ($conf[ 'grootte' ]/2), $laatste_graad, $graden, $kleur[ $i ][ 'donker' ], IMG_ARC_PIE); $laatste_graad = $graden; $step = $step+$stap; } } $laatste_graad = 0; $stap = 40; $step = 0; for( $i = 0; $i <= count( $input )-1; $i++ ) { ## Procenten berekenen ## $procent = (($input[ $i ][ 1 ])*(100/$totaal)); ## En naar graden ## $graden = ((360/100)*($procent)); $graden = $laatste_graad+$graden; ## Kleuren ## $kleur[ $i ][ 'licht' ] = imagecolorallocate( $grafiek, $this->pie[ 'l' ][ $i ][ 0 ], $this->pie[ 'l' ][ $i ][ 1 ], $this->pie[ 'l' ][ $i ][ 2 ] ); $kleur[ $i ][ 'donker' ] = imagecolorallocate( $grafiek, $this->pie[ 'd' ][ $i ][ 0 ], $this->pie[ 'd' ][ $i ][ 1 ], $this->pie[ 'd' ][ $i ][ 2 ] ); imagefilledarc($grafiek, ($conf[ 'max_width' ]/2), ($conf[ 'height' ]/2), $conf[ 'grootte' ], ($conf[ 'grootte' ]/2), $laatste_graad, $graden, $kleur[ $i ][ 'licht' ], IMG_ARC_PIE); if( $conf[ 'legenda' ] ) { imagefilledrectangle( $grafiek, $conf[ 'max_width' ], (50+$step), $conf[ 'max_width' ]+15, (65+$step), $kleur[ $i ][ 'donker' ] ); imagestring( $grafiek, 2, $conf[ 'max_width' ]+20, 50+$step, $input[ $i ][ 0 ], $zwart ); } $laatste_graad = $graden; $step = $step+$stap; } ## Copyright ## if( $conf[ 'copyright' ] ) imagestring( $grafiek, 1, 3, 3, $conf[ 'copyright' ], $dgrijs ); ## Maak het grafiek ## imagepng( $grafiek ); imagedestroy( $grafiek ); } else return; } ?>
Zonder het 3d effect werkt het perfect, alleen zogauw ik dat inschakel klopt er iets niet meer. Zie onderstaand plaatje voor wat er verkeerd gaat:
http://img126.i...iek0cx.jpg
Ik heb géén idee waar dit aan kan liggen, zelf ben ik al een aantal uur hiermee aan het frunniken, maar niks mag helpen. Misschien weten jullie een oplossing?
Alvast bedankt!
Matthias
|