login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Taartgrafiek + 3D

Offline matthias - 25/02/2006 16:29 (laatste wijziging 25/02/2006 16:29)
Avatar van matthiasPHP 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.. ).

  1. <?php
  2. function taartgrafiek( $conf, $input )
  3. {
  4. if ( is_array( $conf ) AND is_array( $input ) )
  5. {
  6. ## Genereer het plaatje ##
  7. $grafiek = imagecreate( $conf [ 'width' ], $conf[ 'height' ] );
  8. $achtergr = imagecolorallocate( $grafiek, 0xFF, 0xFF, 0xFF );
  9.  
  10. ## Loop de hele input array door om het totaal te weten te komen ##
  11. $totaal = 0;
  12. for( $a = 0; $a <= count( $input ); $a++ )
  13. $totaal += $input[ $a ][ 1 ];
  14.  
  15. ## Kleuren ##
  16. $zwart = imagecolorallocate( $grafiek, 0x00, 0x00, 0x00 );
  17. $grijs = imagecolorallocate( $grafiek, 0xEE, 0xEE, 0xEE );
  18. $rood = imagecolorallocate( $grafiek, 0xFF, 0x00, 0x00 );
  19. $dgrijs = imagecolorallocate( $grafiek, 0xAD, 0xAD, 0xAD );
  20. $wit = imagecolorallocate( $grafiek, 0xFF, 0xFF, 0xFF );
  21.  
  22. ## Rekening houden met de legenda ##
  23. if( $conf[ 'legenda' ] )
  24. $conf[ 'max_width' ] = ($conf[ 'width' ]-160);
  25. else
  26. $conf[ 'max_width' ] = $conf[ 'width' ];
  27.  
  28.  
  29. ## Randen om het gehele gebied ##
  30. if( $conf[ 'randen' ] )
  31. {
  32. imageline($grafiek, 0, 0, $conf[ 'width' ], 0, $zwart);
  33. imageline($grafiek, 0, 0, 0, $conf[ 'height' ], $zwart);
  34. imageline($grafiek, ( $conf[ 'width' ]-1 ), 0, ($conf[ 'width' ]-1), $conf[ 'height' ], $zwart);
  35. imageline($grafiek, 0, ($conf[ 'height' ]-1), $conf[ 'width' ], ($conf[ 'height' ]-1), $zwart);
  36. }
  37.  
  38. # Grafiek titel #
  39. imagestring( $grafiek, 6, ($conf[ 'width' ]/2)-(strlen( $conf[ 'titel' ] )*7), 7, $conf[ 'titel' ] , $zwart );
  40.  
  41. ## Het grafiekgebied omlijnen en vullen met grid ##
  42. if( $conf[ 'randen' ] )
  43. {
  44. $eraf = (($conf[ 'max_width' ]-$conf[ 'grootte' ])/2)-5;
  45.  
  46. imageline( $grafiek, $eraf, 30, $conf[ 'max_width' ]-$eraf, 30, $dgrijs );
  47. imageline( $grafiek, $eraf, $conf[ 'height' ]-30, $conf[ 'max_width' ]-$eraf, $conf[ 'height' ]-30, $dgrijs );
  48. imageline( $grafiek, $eraf, 30, $eraf, $conf[ 'height' ]-30, $dgrijs );
  49. imageline( $grafiek, ($conf[ 'max_width' ]-$eraf), 30,($conf[ 'max_width' ]-$eraf), ($conf[ 'height' ]-30), $dgrijs );
  50. }
  51. ## Het grafiekgebied vullen het grid ##
  52. if( $conf[ 'grid' ] > 0 )
  53. {
  54. for( $h = 0; $h <= ($conf[ 'height' ]-60); $h = $h+$conf[ 'grid' ] )
  55. imageline( $grafiek, $eraf+1, 29+$h, $conf[ 'max_width' ]-$eraf-2, 29+$h, $grijs );
  56.  
  57. for( $v = 0; $v <= ($conf[ 'max_width' ]-($eraf*2)-2); $v = $v + $conf[ 'grid' ] )
  58. imageline( $grafiek, (1+$eraf+$v), 31, (1+$eraf+$v), $conf[ 'height' ]-31, $grijs );
  59. }
  60.  
  61. if( $conf[ '3d' ] )
  62. {
  63. for( $i = 0; $i <= count( $input )-1; $i++ )
  64. {
  65. ## Procenten berekenen ##
  66. $procent = (($input[ $i ][ 1 ])*(100/$totaal));
  67.  
  68. ## En naar graden ##
  69. $graden = ((360/100)*($procent));
  70. $graden = $laatste_graad+$graden;
  71.  
  72. ## Kleuren ##
  73. $kleur[ $i ][ 'licht' ] = imagecolorallocate( $grafiek, $this->pie[ 'l' ][ $i ][ 0 ], $this->pie[ 'l' ][ $i ][ 1 ], $this->pie[ 'l' ][ $i ][ 2 ] );
  74. $kleur[ $i ][ 'donker' ] = imagecolorallocate( $grafiek, $this->pie[ 'd' ][ $i ][ 0 ], $this->pie[ 'd' ][ $i ][ 1 ], $this->pie[ 'd' ][ $i ][ 2 ] );
  75.  
  76. for( $a = 1; $a<=30; $a++ )
  77. imagefilledarc($grafiek, ($conf[ 'max_width' ]/2), ($conf[ 'height' ]/2)+$a, $conf[ 'grootte' ], ($conf[ 'grootte' ]/2), $laatste_graad, $graden, $kleur[ $i ][ 'donker' ], IMG_ARC_PIE);
  78.  
  79. $laatste_graad = $graden;
  80. $step = $step+$stap;
  81.  
  82. }
  83. }
  84.  
  85.  
  86. $laatste_graad = 0; $stap = 40; $step = 0;
  87. for( $i = 0; $i <= count( $input )-1; $i++ )
  88. {
  89. ## Procenten berekenen ##
  90. $procent = (($input[ $i ][ 1 ])*(100/$totaal));
  91.  
  92. ## En naar graden ##
  93. $graden = ((360/100)*($procent));
  94. $graden = $laatste_graad+$graden;
  95.  
  96. ## Kleuren ##
  97. $kleur[ $i ][ 'licht' ] = imagecolorallocate( $grafiek, $this->pie[ 'l' ][ $i ][ 0 ], $this->pie[ 'l' ][ $i ][ 1 ], $this->pie[ 'l' ][ $i ][ 2 ] );
  98. $kleur[ $i ][ 'donker' ] = imagecolorallocate( $grafiek, $this->pie[ 'd' ][ $i ][ 0 ], $this->pie[ 'd' ][ $i ][ 1 ], $this->pie[ 'd' ][ $i ][ 2 ] );
  99.  
  100.  
  101. imagefilledarc($grafiek, ($conf[ 'max_width' ]/2), ($conf[ 'height' ]/2), $conf[ 'grootte' ], ($conf[ 'grootte' ]/2), $laatste_graad, $graden, $kleur[ $i ][ 'licht' ], IMG_ARC_PIE);
  102.  
  103. if( $conf[ 'legenda' ] )
  104. {
  105. imagefilledrectangle( $grafiek, $conf[ 'max_width' ], (50+$step), $conf[ 'max_width' ]+15, (65+$step), $kleur[ $i ][ 'donker' ] );
  106.  
  107. imagestring( $grafiek, 2, $conf[ 'max_width' ]+20, 50+$step, $input[ $i ][ 0 ], $zwart );
  108. }
  109.  
  110.  
  111. $laatste_graad = $graden;
  112. $step = $step+$stap;
  113.  
  114. }
  115.  
  116.  
  117. ## Copyright ##
  118. if( $conf[ 'copyright' ] )
  119. imagestring( $grafiek, 1, 3, 3, $conf[ 'copyright' ], $dgrijs );
  120.  
  121. ## Maak het grafiek ##
  122. imagepng( $grafiek );
  123. imagedestroy( $grafiek );
  124. }
  125. else
  126. return;
  127. }
  128. ?>


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

3 antwoorden

Gesponsorde links
Offline haytjes - 26/02/2006 00:19
Avatar van haytjes Gouden medailleGouden medaille

JS gevorderde
dat is een fout in de werkwijze van jou.

als ik het zo zie, maar je eerst die taart diagram (1* schuin) en zet je er dan 10px eronder dezelfde taart diagram, maar zou maak je geen 3d.

Voor 3d, moet je dan ook nog die bovenste met die onderste met lijn verbinden en inkleuren...
Offline Richard - 26/02/2006 07:48
Avatar van Richard Crew algemeen gewoon met een for lusje die 10 px. invullen en daarna de top erop zetten;) is volgens mij op php.net oid wel een voorbeeldje van te vinden.
Offline BigBug - 26/02/2006 08:47
Avatar van BigBug PHP expert Volgensmij kan je het oplossen door als je de image hebt gemaakt, de image 10x onder mekaar te zetten. Met elke keer 1px verschuiving. Want hier heb je 2 plaatjes boven mekaar met 20 (?) px tussenruimte.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.197s