Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LES CAMEMBERTS 3D


Information sur la source

Catégorie :Graphique Classé sous : camembert, 3d, statistique, graphique Niveau : Initié Date de création : 08/10/2005 Date de mise à jour : 14/12/2005 02:12:20 Vu / téléchargé: 13 701 / 1 980

Note :
9,1 / 10 - par 10 personnes
9,10 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (24)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Popularisés par des programmes comme "Excel", les graphiques de type "camembert" représentent les données par "secteurs".
Avec l'essor d'Internet, ce type de graphique a pris une nouvelle impulsion, avec ce que l'on appelle communément les "statistiques" : fréquentation du site, système d'exploitation des visiteurs, navigateur des visiteurs, résolution d'écran des visiteurs, pays d'origine des visiteurs, pages les plus visitées, moteurs de recherches utilisés, age du capitaine, etc...
Chaque connexion alimente alors une base de données, dont l'analyse permettra d'orienter le développement du site dans des directions ciblées.
 

Source

  • <?
  • /*
  • - Date de création : 18/09/2005
  • - nom : camembert.php
  • - auteur : opossum_farceur.
  • - Object : les camemberts 3D.
  • - Source : http://fr3.php.net/manual/fr/function.imagefilledarc.php
  • */
  • function camembert($arr)
  • {
  • $size=3; /* taille de la police, largeur du caractère */
  • $ifw=imagefontwidth($size);
  • $w=500; /* largeur de l'image */
  • $h=250; /* hauteur de l'image */
  • $a=120; /* grand axe du camembert */
  • $b=$a/2; /* 60 : petit axe du camembert */
  • $d=$a/2; /* 60 : "épaisseur" du camembert */
  • $cx=$w/2-1; /* abscisse du "centre" du camembert */
  • $cy=($h-$d)/2; /* 95 : ordonnée du "centre" du camembert */
  • $A=138; /* grand axe de l'ellipse "englobante" */
  • $B=102; /* petit axe de l'ellipse "englobante" */
  • $oy=-$d/2; /* -30 : du "centre" du camembert à celui de l'ellipse "englobante"*/
  • $img=imagecreate($w,$h);
  • $bgcolor=imagecolorallocate($img,0xCD,0xCD,0xCD);
  • imagecolortransparent($img,$bgcolor);
  • $black=imagecolorallocate($img,0,0,0);
  • /* calcule la somme des données */
  • for ($i=$sum=0,$n=count($arr);$i<$n;$i++) $sum+=$arr[$i][0];
  • /* fin des préliminaires : on peut vraiment commencer! */
  • for ($i=$v[0]=0,$x[0]=$cx+$a,$y[0]=$cy,$doit=true;$i<$n;$i++) {
  • for ($j=0,$k=16;$j<3;$j++,$k-=8) $t[$j]=($arr[$i][1]>>$k) & 0xFF;
  • /* détermine les "vraies" couleurs */
  • $color[$i]=imagecolorallocate($img,$t[0],$t[1],$t[2]);
  • /* calcule l'angle des différents "secteurs" */
  • $v[$i+1]=$v[$i]+round($arr[$i][0]*360/$sum);
  • if ($doit) { /* détermine les couleurs "ombrées" */
  • $shade[$i]=imagecolorallocate($img,max(0,$t[0]-50),max(0,$t[1]-50),max(0,$t[2]-50));
  • if ($v[$i+1]<180) { /* calcule les coordonnées des différents parallélogrammes */
  • $x[$i+1]=$cx+$a*cos($v[$i+1]*M_PI/180);
  • $y[$i+1]=$cy+$b*sin($v[$i+1]*M_PI/180);
  • }
  • else {
  • $m=$i+1;
  • $x[$m]=$cx-$a; /* c'est comme si on remplaçait $v[$i+1] par 180° */
  • $y[$m]=$cy;
  • $doit=false; /* indique qu'il est inutile de continuer! */
  • }
  • }
  • }
  • /* dessine la "base" du camembert */
  • for ($i=0;$i<$m;$i++) imagefilledarc($img,$cx,$cy+$d,2*$a,2*$b,$v[$i],$v[$i+1],$shade[$i],IMG_ARC_PIE);
  • /* dessine la partie "verticale" du camembert */
  • for ($i=0;$i<$m;$i++) {
  • $area=array($x[$i],$y[$i]+$d,$x[$i],$y[$i],$x[$i+1],$y[$i+1],$x[$i+1],$y[$i+1]+$d);
  • imagefilledpolygon($img,$area,4,$shade[$i]);
  • }
  • /* dessine le dessus du camembert */
  • for ($i=0;$i<$n;$i++) imagefilledarc($img,$cx,$cy,2*$a,2*$b,$v[$i],$v[$i+1],$color[$i],IMG_ARC_PIE);
  • /*imageellipse($img,$cx,$cy-$oy,2*$A,2*$B,$black); // dessine l'ellipse "englobante" */
  • /* dessine les "flêches" et met en place le texte */
  • for ($i=0,$AA=$A*$A,$BB=$B*$B;$i<$n;$i++) if ($arr[$i][0]) {
  • $phi=($v[$i+1]+$v[$i])/2;
  • /* intersection des "flêches" avec l'ellipse "englobante" */
  • $px=$a*3*cos($phi*M_PI/180)/4;
  • $py=$b*3*sin($phi*M_PI/180)/4;
  • /* équation du 2ème degré avec 2 racines réelles et distinctes */
  • $U=$AA*$py*$py+$BB*$px*$px;
  • $V=$AA*$oy*$px*$py;
  • $W=$AA*$px*$px*($oy*$oy-$BB);
  • /* calcule le pourcentage à afficher */
  • $value=number_format(100*$arr[$i][0]/$sum,2,",","")."%";
  • /* écrit le texte à droite */
  • if ($phi<90 || $phi>270) {
  • $root=(-$V+sqrt($V*$V-$U*$W))/$U;
  • imageline($img,$px+$cx,$py+$cy,$qx=$root+$cx,$qy=$root*$py/$px+$cy,$black);
  • imageline($img,$qx,$qy,$qx+10,$qy,$black);
  • imagestring($img,$size,$qx+14,$qy-12,$arr[$i][2],$black);
  • imagestring($img,$size,$qx+14,$qy-2,$value,$black);
  • }
  • else { /* écrit le texte à gauche */
  • $root=(-$V-sqrt($V*$V-$U*$W))/$U;
  • imageline($img,$px+$cx,$py+$cy,$qx=$root+$cx,$qy=$root*$py/$px+$cy,$black);
  • imageline($img,$qx,$qy,$qx-10,$qy,$black);
  • imagestring($img,$size,$qx-12-$ifw*strlen($arr[$i][2]),$qy-12,$arr[$i][2],$black);
  • imagestring($img,$size,$qx-12-$ifw*strlen($value),$qy-2,$value,$black);
  • }
  • }
  • header("Content-type: image/png");
  • imagepng($img);
  • imagedestroy($img);
  • }
  • $arr=array(
  • /* donnée couleur légende */
  • array( 40, 0xFF99CC, "Loisirs"),
  • array( 80, 0xFF9900, "Assurance"),
  • array( 160, 0xFFCB03, "Credits"),
  • array( 160, 0x99CC00, "Carburant"),
  • array( 200, 0x339966, "Charges"),
  • array( 240, 0x33CCCC, "Rentrée"),
  • array( 280, 0x0091C3, "Nourriture"),
  • array( 340, 0x969696, "Loyer")
  • );
  • camembert($arr); /* enjoy! */
  • ?>
<?
/*
 - Date de création : 18/09/2005
 - nom : camembert.php
 - auteur : opossum_farceur.
 - Object : les camemberts 3D.
 - Source : http://fr3.php.net/manual/fr/function.imagefilledarc.php
*/ 

function camembert($arr)
{	
   $size=3;                  /* taille de la police, largeur du caractère */
   $ifw=imagefontwidth($size);							
	
   $w=500;                   /* largeur de l'image */
   $h=250;                   /* hauteur de l'image */
   $a=120;                   /* grand axe du camembert */
   $b=$a/2;                  /* 60 : petit axe du camembert */
   $d=$a/2;                  /* 60 : "épaisseur" du camembert */
   $cx=$w/2-1;               /* abscisse du "centre" du camembert */
   $cy=($h-$d)/2;            /* 95 : ordonnée du "centre" du camembert */
	
   $A=138;                   /* grand axe de l'ellipse "englobante" */
   $B=102;                   /* petit axe de l'ellipse "englobante" */
   $oy=-$d/2;                /* -30 : du "centre" du camembert à celui de l'ellipse "englobante"*/

   $img=imagecreate($w,$h);  
   $bgcolor=imagecolorallocate($img,0xCD,0xCD,0xCD);	
   imagecolortransparent($img,$bgcolor); 
   $black=imagecolorallocate($img,0,0,0);
                             /* calcule la somme des données */
   for ($i=$sum=0,$n=count($arr);$i<$n;$i++) $sum+=$arr[$i][0];	
	
   /* fin des préliminaires : on peut vraiment commencer! */
   for ($i=$v[0]=0,$x[0]=$cx+$a,$y[0]=$cy,$doit=true;$i<$n;$i++) {														
      for ($j=0,$k=16;$j<3;$j++,$k-=8) $t[$j]=($arr[$i][1]>>$k) & 0xFF;
                             /* détermine les "vraies" couleurs */
      $color[$i]=imagecolorallocate($img,$t[0],$t[1],$t[2]);
                             /* calcule l'angle des différents "secteurs" */
      $v[$i+1]=$v[$i]+round($arr[$i][0]*360/$sum);	
														
      if ($doit) {           /* détermine les couleurs "ombrées" */
         $shade[$i]=imagecolorallocate($img,max(0,$t[0]-50),max(0,$t[1]-50),max(0,$t[2]-50)); 
														
         if ($v[$i+1]<180) { /* calcule les coordonnées des différents parallélogrammes */
            $x[$i+1]=$cx+$a*cos($v[$i+1]*M_PI/180);		
            $y[$i+1]=$cy+$b*sin($v[$i+1]*M_PI/180);	
         }										
         else {
            $m=$i+1;
            $x[$m]=$cx-$a;   /* c'est comme si on remplaçait $v[$i+1] par 180° */
            $y[$m]=$cy;	
            $doit=false;     /* indique qu'il est inutile de continuer! */
         }
      }
   }
	
   /* dessine la "base" du camembert */
   for ($i=0;$i<$m;$i++) imagefilledarc($img,$cx,$cy+$d,2*$a,2*$b,$v[$i],$v[$i+1],$shade[$i],IMG_ARC_PIE);
	
   /* dessine la partie "verticale" du camembert */														
   for ($i=0;$i<$m;$i++) {						
      $area=array($x[$i],$y[$i]+$d,$x[$i],$y[$i],$x[$i+1],$y[$i+1],$x[$i+1],$y[$i+1]+$d);
      imagefilledpolygon($img,$area,4,$shade[$i]);			
   }
	
   /* dessine le dessus du camembert */
   for ($i=0;$i<$n;$i++) imagefilledarc($img,$cx,$cy,2*$a,2*$b,$v[$i],$v[$i+1],$color[$i],IMG_ARC_PIE);

   /*imageellipse($img,$cx,$cy-$oy,2*$A,2*$B,$black);	// dessine l'ellipse "englobante" */
	
   /* dessine les "flêches" et met en place le texte */
   for ($i=0,$AA=$A*$A,$BB=$B*$B;$i<$n;$i++) if ($arr[$i][0]) {
      $phi=($v[$i+1]+$v[$i])/2;       
                             /* intersection des "flêches" avec l'ellipse "englobante" */
      $px=$a*3*cos($phi*M_PI/180)/4;		
      $py=$b*3*sin($phi*M_PI/180)/4;		
                             /* équation du 2ème degré avec 2 racines réelles et distinctes */	
      $U=$AA*$py*$py+$BB*$px*$px;         
      $V=$AA*$oy*$px*$py;						
      $W=$AA*$px*$px*($oy*$oy-$BB);	
                             /* calcule le pourcentage à afficher */
      $value=number_format(100*$arr[$i][0]/$sum,2,",","")."%";
                             /* écrit le texte à droite */	
      if ($phi<90 || $phi>270) {          
         $root=(-$V+sqrt($V*$V-$U*$W))/$U;
         imageline($img,$px+$cx,$py+$cy,$qx=$root+$cx,$qy=$root*$py/$px+$cy,$black);
         imageline($img,$qx,$qy,$qx+10,$qy,$black);		
		
         imagestring($img,$size,$qx+14,$qy-12,$arr[$i][2],$black);
         imagestring($img,$size,$qx+14,$qy-2,$value,$black);
      }
      else {                 /* écrit le texte à gauche */
         $root=(-$V-sqrt($V*$V-$U*$W))/$U;
         imageline($img,$px+$cx,$py+$cy,$qx=$root+$cx,$qy=$root*$py/$px+$cy,$black);
         imageline($img,$qx,$qy,$qx-10,$qy,$black);		
			 		
         imagestring($img,$size,$qx-12-$ifw*strlen($arr[$i][2]),$qy-12,$arr[$i][2],$black);
         imagestring($img,$size,$qx-12-$ifw*strlen($value),$qy-2,$value,$black);
      }
   }

   header("Content-type: image/png");
   imagepng($img);
   imagedestroy($img);
}

$arr=array(
/*        donnée   couleur    légende */
   array(    40,  0xFF99CC,   "Loisirs"),
   array(    80,  0xFF9900,   "Assurance"),
   array(   160,  0xFFCB03,   "Credits"),
   array(   160,  0x99CC00,   "Carburant"),
   array(   200,  0x339966,   "Charges"),
   array(   240,  0x33CCCC,   "Rentrée"),
   array(   280,  0x0091C3,   "Nourriture"),
   array(   340,  0x969696,   "Loyer")
);

camembert($arr);                          /* enjoy! */
?>

Conclusion

Pour le fonctionnement, consulter le fichier "Camembert.html", présent dans le "zip".
Pour l'exécution du code, la bibliothèque gd2 est requise.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

07 décembre 2005 20:15:15 :
Réponse du 07/12/2005 de opossum_farceur à pichpoich, Le fichier contenant la fonction "camembert()" ne doit pas contenir de code "html" : donc pas de <html>, de <head> et autre <body>, et donc pas non plus de "echo" et autre "print". Par contre, il n'est pas interdit d'écrire sur l'image en mode graphique : tu aurais étudié un peu le code, tu aurais peut-être remarqué que le texte est "dessiné" grâce à la fonction "imagestring()". Ceci-dit, le problème que tu évoques s'inscrit dans un cadre plus général que l'on peut résumer ainsi : comment mettre en oeuvre la fonction "camembert()" dans une véritable application ? J'apporte des éléments de réponse dans le répertoire "exemple" de camembert.zip (que j'ai mis à jour pour l'occasion et qu'il faut donc recharger). Ce répertoire contient 2 fichiers : - main.php : fichier principal dans lequel est écrit le commentaire du graphique, et dans lequel on peut faire tout ce que l'on veut. Ce fichier détient initialement les données dans le tableau "$arr". Ce tableau est converti en une chaîne de caractère par la fonction "arr2str()" de manière à pouvoir être incorporé à une url. - moncamembert.php : fichier php "pur" qui dessine le camembert. La chaîne transmise par $_GET est reconvertie en tableau par la fonction "str2arr()", lequel pourra alors alimenter la fonction "camembert()". Voilà, d'autres mécanismes de transmission sont certainement possibles et, s'ils ne font pas intervenir de variables "globales", je suis preneur. J'espère avoir été clair et avoir répondu à ta question.
07 décembre 2005 20:31:03 :
afin de répondre à un problème évoqué par pichpoich, ajout dans le zip d'une petite démo
14 décembre 2005 02:12:20 :
ajout des fichiers manquants

Commentaires et avis

signaler à un administrateur
Commentaire de ImmortalPC le 08/10/2005 18:37:03

Salut,
1) Remplace <? par <?php dsl c'est pour une meilleur compactibilité
2) C'est pas obligé mais vaux mieux utiliser les ' que les "
Ton code :
<?php
/*
- Date de création : 18/09/2005
- nom : camembert.php
- auteur : opossum_farceur.
- Object : les camemberts 3D.
- Source : http://fr3.php.net/manual/fr/function.imagefilledarc.php
*/

function camembert($arr)
{
   $size=3;                  /* taille de la police, largeur du caractère */
   $ifw=imagefontwidth($size);

   $w=500;                   /* largeur de l'image */
   $h=250;                   /* hauteur de l'image */
   $a=120;                   /* grand axe du camembert */
   $b=$a/2;                  /* 60 : petit axe du camembert */
   $d=$a/2;                  /* 60 : "épaisseur" du camembert */
   $cx=$w/2-1;               /* abscisse du "centre" du camembert */
   $cy=($h-$d)/2;            /* 95 : ordonnée du "centre" du camembert */

   $A=138;                   /* grand axe de l'ellipse "englobante" */
   $B=102;                   /* petit axe de l'ellipse "englobante" */
   $oy=-$d/2;                /* -30 : du "centre" du camembert à celui de l'ellipse "englobante"*/

   $img=imagecreate($w,$h);  
   $bgcolor=imagecolorallocate($img,0xCD,0xCD,0xCD);
   imagecolortransparent($img,$bgcolor);
   $black=imagecolorallocate($img,0,0,0);
                             /* calcule la somme des données */
   for ($i=$sum=0,$n=count($arr);$i<$n;$i++) $sum+=$arr[$i][0];

   /* fin des préliminaires : on peut vraiment commencer! */
   for ($i=$v[0]=0,$x[0]=$cx+$a,$y[0]=$cy,$doit=true;$i<$n;$i++) {
      for ($j=0,$k=16;$j<3;$j++,$k-=8) $t[$j]=($arr[$i][1]>>$k) & 0xFF;
                             /* détermine les "vraies" couleurs */
      $color[$i]=imagecolorallocate($img,$t[0],$t[1],$t[2]);
                             /* calcule l'angle des différents "secteurs" */
      $v[$i+1]=$v[$i]+round($arr[$i][0]*360/$sum);

      if ($doit) {           /* détermine les couleurs "ombrées" */
         $shade[$i]=imagecolorallocate($img,max(0,$t[0]-50),max(0,$t[1]-50),max(0,$t[2]-50));

         if ($v[$i+1]<180) { /* calcule les coordonnées des différents parallélogrammes */
            $x[$i+1]=$cx+$a*cos($v[$i+1]*M_PI/180);
            $y[$i+1]=$cy+$b*sin($v[$i+1]*M_PI/180);
         }
         else {
            $m=$i+1;
            $x[$m]=$cx-$a;   /* c'est comme si on remplaçait $v[$i+1] par 180° */
            $y[$m]=$cy;
            $doit=false;     /* indique qu'il est inutile de continuer! */
         }
      }
   }

   /* dessine la "base" du camembert */
   for ($i=0;$i<$m;$i++) imagefilledarc($img,$cx,$cy+$d,2*$a,2*$b,$v[$i],$v[$i+1],$shade[$i],IMG_ARC_PIE);

   /* dessine la partie "verticale" du camembert */
   for ($i=0;$i<$m;$i++) {
      $area=array($x[$i],$y[$i]+$d,$x[$i],$y[$i],$x[$i+1],$y[$i+1],$x[$i+1],$y[$i+1]+$d);
      imagefilledpolygon($img,$area,4,$shade[$i]);
   }

   /* dessine le dessus du camembert */
   for ($i=0;$i<$n;$i++) imagefilledarc($img,$cx,$cy,2*$a,2*$b,$v[$i],$v[$i+1],$color[$i],IMG_ARC_PIE);

   /*imageellipse($img,$cx,$cy-$oy,2*$A,2*$B,$black); // dessine l'ellipse "englobante" */

   /* dessine les "flêches" et met en place le texte */
   for ($i=0,$AA=$A*$A,$BB=$B*$B;$i<$n;$i++) if ($arr[$i][0]) {
      $phi=($v[$i+1]+$v[$i])/2;      
                             /* intersection des "flêches" avec l'ellipse "englobante" */
      $px=$a*3*cos($phi*M_PI/180)/4;
      $py=$b*3*sin($phi*M_PI/180)/4;
                             /* équation du 2ème degré avec 2 racines réelles et distinctes */
      $U=$AA*$py*$py+$BB*$px*$px;        
      $V=$AA*$oy*$px*$py;
      $W=$AA*$px*$px*($oy*$oy-$BB);
                             /* calcule le pourcentage à afficher */
      $value=number_format(100*$arr[$i][0]/$sum,2,',','').'%';
                             /* écrit le texte à droite */
      if ($phi<90 || $phi>270) {          
         $root=(-$V+sqrt($V*$V-$U*$W))/$U;
         imageline($img,$px+$cx,$py+$cy,$qx=$root+$cx,$qy=$root*$py/$px+$cy,$black);
         imageline($img,$qx,$qy,$qx+10,$qy,$black);

         imagestring($img,$size,$qx+14,$qy-12,$arr[$i][2],$black);
         imagestring($img,$size,$qx+14,$qy-2,$value,$black);
      }
      else {                 /* écrit le texte à gauche */
         $root=(-$V-sqrt($V*$V-$U*$W))/$U;
         imageline($img,$px+$cx,$py+$cy,$qx=$root+$cx,$qy=$root*$py/$px+$cy,$black);
         imageline($img,$qx,$qy,$qx-10,$qy,$black);

         imagestring($img,$size,$qx-12-$ifw*strlen($arr[$i][2]),$qy-12,$arr[$i][2],$black);
         imagestring($img,$size,$qx-12-$ifw*strlen($value),$qy-2,$value,$black);
      }
   }

   header('Content-type: image/png');
   imagepng($img);
   imagedestroy($img);
}

$arr=array(
/*        donnée   couleur    légende */
   array(    40,  0xFF99CC,   'Loisirs'),
   array(    80,  0xFF9900,   'Assurance'),
   array(   160,  0xFFCB03,   'Credits'),
   array(   160,  0x99CC00,   'Carburant'),
   array(   200,  0x339966,   'Charges'),
   array(   240,  0x33CCCC,   'Rentrée'),
   array(   280,  0x0091C3,   'Nourriture'),
   array(   340,  0x969696,   'Loyer')
);

camembert($arr);                          /* enjoy! */
?>

Une class aurait été la bienvenu ;-)
Si non facile d'installation, simple et complex à la fois :
8/10
@+

signaler à un administrateur
Commentaire de EMSIEN le 09/10/2005 00:06:31

Je vois que c'est une bonne idée,mais puisque tu utilises une bibliothèque je t'informe que JPgraph est très performante dans le traitement des graphiques,puisque tu n'a pas besoin de calculer ni la somme ni les angles ni tous ça.
juste un vecteur contenant tes statistiques et le tour est joué.
En tout Continue et surtout bonne porg.
http://ntic.blogspirit.com

signaler à un administrateur
Commentaire de stepibou le 27/11/2005 00:56:54

salut,
bien bien, tu peux utiliser imagecreatetruecolors à la place de imagecreate.
a+

signaler à un administrateur
Commentaire de opossum_farceur le 27/11/2005 16:31:06

Réponse de : opossum_farceur

- tout d'abord, la fonction c'est
"imagecreatetruecolor", et non pas
"imagecreatetruecolors" (non mais...)

- lors de l'écriture du code j'ai opté pour
"imagecreate" car avec "imagecreatetruecolor"      
j'arrivais pas à obtenir de fond transparent (si une solution existe, je suis preneur).  

- ceci dit le véritable problème (mais est-ce vraiment un problème?) est ailleurs : il s'agit de
la technique utilisée pour écrire sur l'image.
L'intérêt de cette technique est qu'elle ne nécessite pas de fichier externe contenant la police.
La mise en oeuvre du code est alors d'une simplicité extrême : on fait un copier-coller, on enregistre et paf!, çà marche.
Mais essayez de changer le texte des légendes, de mettre par exemple quelque part le mot "problème" : aie!, le caractère accentué est mal affiché.
Mise à part la solution consistant à écrire en anglais (no problem!), la solution est à rechercher dans l'arsenal de fonctions proposées par la bibliothèque gd2.
Personnelement, j'utilise la police "verdana.ttf" associée aux fonctions "imagettftext" et
"imagettfbbox"; la mise en oeuvre est différente mais ne devrait pas poser de problèmes aux tueurs en PHP que vous êtes!

signaler à un administrateur
Commentaire de stepibou le 27/11/2005 17:09:32

ouai pardon,
pour la transparence, c'est vrai que c'est pas evident!
si on est en png , y faut rester en png. De meme pour les gif.
Sauf que sous IE, y a des pbs avec la transparence de png, encore merci IE!
si tu veux la transparence : tu as :
   imageSaveAlpha($img, true);
   imagealphablending($img, true);
n'oublie pas la fct imagecolorallocatealpha,
tu trouvera tous les renseignement sur fr.php.net.
Sinon, les caractères spéciaux dépendent uniquement de la font , je pense.
Bon code à toi! ;)

signaler à un administrateur
Commentaire de pichpoich le 06/12/2005 00:09:46

Tout d'abord, merci opposum pour cette source qui m'ouvre des perspectives auxquelles je ne révais pas (sur mon petit site en bout de ligne et dans mon coin bien entendu).

Un tout petit bémol cependant, je voudrais commenter des résultats puis insérer ton graph, mais aucun texte ne passe, même lorsque je mets un bon vieux echo au milieu de ton code.

Alors j'ai l'impression que le header("Content-type: image/png"); en fin de fonction y est pour quelque chose, mais étant auto pas tout à fait didacte, je ne sais pas vraiment quoi faire. Je suppose qu'il existe une fonction adéquate ou une déclaration tout bête à faire quelque part mais bon...

En attendant un peu d'aide, si ça n'est pas trop exagéré, je vais rererepotasser le tutorial de nexen dés fois que...

Encore merci pour ta source opposum.

signaler à un administrateur
Commentaire de opossum_farceur le 07/12/2005 20:27:46

Réponse du 07/12/2005 de opossum_farceur à pichpoich.

Le fichier contenant la fonction "camembert()" ne doit pas contenir de code "html" : donc pas de <html>, de <head> et autre <body>, et donc pas non plus de "echo" et autre "print".
Par contre, il n'est pas interdit d'écrire sur l'image en mode graphique : tu aurais étudié un peu le code, tu aurais peut-être remarqué que le texte est "dessiné" grâce à la fonction "imagestring()".
Ceci-dit, le problème que tu évoques s'inscrit dans un cadre plus général que l'on peut résumer ainsi :
comment mettre en oeuvre la fonction "camembert()" dans une véritable application ?

J'apporte des éléments de réponse dans le répertoire "exemple" de camembert.zip (que j'ai mis à jour pour l'occasion et qu'il faut donc recharger).
Ce répertoire contient 2 fichiers :

- main.php : fichier principal dans lequel est écrit le commentaire du graphique, et dans lequel on peut faire tout ce que l'on veut. Ce fichier détient initialement les données dans le tableau "$arr".
Ce tableau est converti en une chaîne de caractère par la fonction "arr2str()" de manière à pouvoir être incorporé à une url.

- moncamembert.php : fichier php "pur" qui dessine le camembert. La chaîne transmise par $_GET est reconvertie en tableau par la fonction "str2arr()", lequel pourra alors alimenter la fonction "camembert()".

Voilà, d'autres mécanismes de transmission sont certainement possibles et, s'ils ne font pas intervenir de variables "globales", je suis preneur.
J'espère que j'ai été clair et que j'ai répondu à ta question.

signaler à un administrateur
Commentaire de pichpoich le 07/12/2005 22:21:17

Salut opossum,

c'est sympa d'avoir répondu et d'avoir pris du temps pour éditer l'exemple, je passe membre du club et je télécharge les fichiers.

Je t'avoue que certain concepts de programation sont encore totalement flous pour moi, et quand j'ai regardé ton code, je me suis demandé si pour écrire un truc comme ça, il fallait être bon en math ou en graphisme (bon, initialiser des valeurs pour des axes ou calculer un angle, ça peut se conçevoir, mais les ellipses, alors là! chapeau),  du coup le fait que le texte soit dessiné n'a pas eu en moi l'impact qu'il aurait dû avoir.

J'ai compris à présent (tout du moins ton explication), Je vais donc potasser ce que tu as fait et voir comment je peux l'appliquer avec ce que je fais. Si jamais j'apporte quelque chose (on peut toujours réver un peu) je te le ferais savoir.

Le cas échéant, je te remercie pour tout.

signaler à un administrateur
Commentaire de pichpoich le 13/12/2005 18:22:02

Salut, ce message pour te dire que le zip n'est pas à jour et que l'on ne peut pas accéder aux fichiers (il y a une erreur sur la page dixit nix).
A plus.

signaler à un administrateur
Commentaire de opossum_farceur le 14/12/2005 02:08:06

Réponse à PICHPOICH
Ok pour la remarque, et désolé pour le contretemps.
Nouvelle mise à jour, cette fois ci dans le calme et la sérénité.
Mais il y a quand même un problème, du côté de Nix, vu que le contenu (affiché) du zip ne correspondait pas à la réalité.

signaler à un administrateur
Commentaire de niko14 le 10/02/2006 08:34:12

j'ai une question!
vu que moi mes données vont venir d'une base de données est ce qu'il serait possible de changer qqch ds le script pour que les couleurs se générent automatiquement parce que d'une année sur l'autre il peut y aoir plus ou moins de parties a mon camembert et pis c'est en gestion de contenu donc je vais pas leur faire ecrire ds le code ni ecrire les couleurs ds la bdd sous forme #.....
merce de me repondre

signaler à un administrateur
Commentaire de opossum_farceur le 11/02/2006 14:46:59

Réponse de opossum_farceur à niko14 :

1) l'objectif de la fonction camembert($arr)" est évidemment de pouvoir représenter dynamiquement des données, d'où l'interface que constitue le tableau $arr : tu l'alimentes comme tu veux, avec ou sans base de données, et si les couleurs te posent problème, tu peux les stocker dans un tableau annexe.

Ex :

$mycolor=array(0xFF99CC,0xFF9900,0xFFCB03,0x99CC00,0x339966,0x33CCCC);
$arr=array(); // initialisation du tableau à transmettre
.......................................................................
$sql="select myvalue,mylegend from mytable;";
$query=mysql_query($sql) or die("Erreur requête :<br>".$sql);

// alimentation dynamique du tableau $arr
for ($j=0;$assoc=mysql_fetch_assoc($query);$j++) {
   $arr[$j][0]=$assoc['myvalue'];
   $arr[$j][1]=$mycolor[$j];
   $arr[$j][2]=$assoc['mylegend'];
}

camembert($arr);
.......................................................................

Un problème peut se poser, c'est que tu épuises ton "stock" de couleurs : qu'à celà ne tienne, tu fais un "modulo" :
$arr[$j][1]=$mycolor[$j%count($mycolor)];
qui fait repartir les couleurs au début.
Le mieux évidemment c'est de prévoir à l'avance le nombre maxi de portions que va comporter ton camembert, et les couleurs qui vont avec. Quant à générer les couleurs de manière aléatoire, je déconseille vivement, le résultat risque d'être vraiment trop décevant.

2) La vraie difficulté, il me semble, c'est celle évoquée par pichpoich (voir commentaires) : comment intégrer l'image générée dans une véritable application.
Une réponse à cette question se trouve dans le zip (mais l'as-tu téléchargé?).

3) J'espère avoir répondu à ta question.

signaler à un administrateur
Commentaire de niko14 le 13/02/2006 08:09:55

Merci bien oppossum_farceur, en fait j'avais retravaillé dessus et j'avais trouvé comment faire pour alimenter mon cammbert avec une base!
De plus pour les couleurs je vais proposer les couleurs a choisir dans une liste deroulante a coté d'ou on rentrera les données dans la base comme ca l'administrateur choisira lui meme la couleur qu'il veut donner a sa portion de camembert!
Et pour ca qui est  de retraiter l'image et de l'afficher apres, ca roule aussi en fait je ne stocke qu'une fois l'image et le traitement se fait en direct qd la personne choisit le budget qu'elle veut afficher, le resultat de la requete par rapport au mysql_query alimente mon tableau...
Je ne sais pas si je me fais bien comprendre il est tot  le matin et je suis encore ds le coltard!!!
;-)
Merci beaucoup de ton aide et a bientot par ici!!!

signaler à un administrateur
Commentaire de badoux le 17/06/2006 10:19:23

Bonjour,

SUper script, moi j'ai qu'une chose à dire, MERCI, très complet, léger, simple ! Tout ce qui constitue un bon code source !

Additionner à de l'AJAX, il peut être vraiment très pratique, pour des stats dynamiques ;-) !

Juste une question, il n'ai pas possible de travailler un peu les bords du camembert ? Je sais que php n'est pas fais à la base pour travailler les images, mais dans la prog il y a toujour une solution à quelque part :-)!

Merci encors opossum_farceur :-)

signaler à un administrateur
Commentaire de opossum_farceur le 18/06/2006 03:04:58

Bonjoir,
Merci pour les compliments, j'en retiens le terme "léger" : ce code a été conçu à l'origine pour aller sur php.net, on y trouve des "bouts" de code de quelques dizaines de lignes maxi, qui sont généralement suffisants pour débloquer le développeur en difficulté.
Mais voilà, la fonction "camembert" prenait encore trop de place, c'est pourquoi elle a finalement échoué à CODES SOURCES.
Bravo si t'arrives à l'assaisonner avec de l'AJAX, en fait le but de la manoeuvre, c'est que, comme le code n'est pas trop long, des gens comme toi n'hésitent pas à l'adapter à leurs besoins, tu peux en faire une classe, tu peux rendre les dimensions du camembert paramétrables, tu peux faire intervenir une véritable police de caractères pour gérer correctement les accents, etc...

Quant à ta question concernant les bords du camembert, j'avoue ne pas avoir bien compris :
s'agit-il des bords de l'image qui ne sont pas visibles? Si c'est le cas, vu que le fond de l'image est transparent, il y a des choses que l'on peut faire dans le fichier "main.php" (voir l'exemple), comme mettre une image de fond qui peut être un cadre. Il va sans dire que l'on peut intervenir également directement dans la fonction "camembert", en remplaçant le fond transparent par un vrai fond, en "dessinant" un cadre, etc...
Amicalement.

signaler à un administrateur
Commentaire de badoux le 18/06/2006 12:34:38

Bonjour et bon dimanche !:)

Je cite:
"Quant à ta question concernant les bords du camembert, j'avoue ne pas avoir bien compris : "

Il sagit simplement de la qualité du traisvai "un peux pixelisé" ! Mais ce n'ai pas grave du tout ! J'avais essayé, jpowered Graph3D, qui offre divers Graph plus propre (graphiquement)! mais il n'ait pas facile de le modifier à ca gise ! Alors j'ai opté pour le tien !:-) Merci encor !

P.S. J'utilise ton code source pour un projet d'annuaire en ligne, je voudrai bien ton nom et prénom pour le citer dans ma rubrique: "avec le soutien de:" :-) Si tu est d'accord biensur !

signaler à un administrateur
Commentaire de ImmortalPC le 19/06/2006 10:05:16

Salut,
badoux as tu le lien pour jpowered Graph3D pour voir ce que ça donne.
Merci
@+

signaler à un administrateur
Commentaire de badoux le 19/06/2006 10:49:47

Salut, ImmortalPC !

Je pense pas que ce sois très cool de parler d'un concurent et de lui faire une pub direct avec un lien ;-), mais étant donnée que "jpowered Graph3D" est payant, je te la donne quand meme ! mais, par MP ! :-)

++

signaler à un administrateur
Commentaire de opossum_farceur le 20/06/2006 01:57:01

Salut, BADOUX !
Mon nom : Michel VAN THODIEP
Par "un peux pixelisé", tu veux dire je pense que les tracés ressemblent un peu trop à des "escaliers" dont les marches gagneraient à être moins visibles. La solution de ce problème passe, il me semble, par la réécriture des fonctions de gd2 qui sont utilisées, ce qui représente un véritable effort. On pourrait aussi envisager le traitement de l'image par des filtres, quoique le résultat n'est pas garanti, surtout en ce qui concerne le texte, qui risque de devenir illisible.
Amicalement.

signaler à un administrateur
Commentaire de badoux le 20/06/2006 08:28:16

Salut, Michel VAN THODIEP :-)

Merci pour ton nom !

// Par "un peux pixelisé", tu veux dire je pense que les tracés ressemblent un peu trop à des "escaliers" dont les marches gagneraient à être moins visibles. //

Tout à fais !

A vrai dire, je suis pas en craque dans la lib GD !

Donc je garde telle quel pour le moment, je corrigerai ce detail plus tard !

++ et merci encors !:-)

signaler à un administrateur
Commentaire de Gallient le 11/07/2006 11:03:13

Et bien sur tout les camenberts que j'ai trouvé, ca doit être le seul qui marche... donc je note déjà minimun 5/10, et vu en plus qu'il y a une légende incrustée sur le camembert et que camembert est bien écrit rire(lol); je met 9/10.

signaler à un administrateur
Commentaire de opossum_farceur le 28/08/2006 01:26:31

Avis aux amateurs de camembert,
j'ai publié une nouvelle source de camembert, "Smooth 3D Camembert", à l'adresse suivante :
http://www.phpcs.com/codes/SMOOTH-3D-CAMEMBERT_39291.aspx

signaler à un administrateur
Commentaire de rottweiler le 29/04/2008 12:07:50

tout simplement extra , j'avais presque abandonné l'idée d'en utiliser tellement que c'était long à étudier ses graph

signaler à un administrateur
Commentaire de opossum_farceur le 11/05/2008 00:16:33

Bonjour!
L'adresse de mon dernier camembert (crémeux et moelleux bien comme il faut!) :
http://www.javascriptfr.com/codes/SVG3DCAMEMBERT_46033.aspx
a++

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

faire un graphique camembert 3D, a partir d'une base de données [ par otacon67 ] je suis un newbies en PHP, et je voudrais savoir comment creer un camembert en 3D, a partir d'une base de donn&#233;es merci pour votre soutien et vo Statistique graphique, pourquoi ne parler que de JPgraph ? [ par crazygogo ] Pourquoi JPGRAPH ??? payant pour les sociétés.... alors qu'il existe ArtiChow : http://www.artichow.orgje fais de la pub pour ma source mais elle perm mise a jour de graph via AJAX? [ par LaTatadu91 ] Bonjour a tous; voila&nbsp; sur uen de mes pages php je cr&#233;&