Accueil > > > LES CAMEMBERTS 3D
LES CAMEMBERTS 3D
Information sur la source
Description
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.
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
Sources du même auteur
Sources de la même categorie
Commentaires et avis
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é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
Aide balise include [ par spikedu12 ]
Salut! Voila je suis en train de créer un site pour une entreprise, qui a choisi un kit graphique correspondant a leur goût pour accéléré la mise e
statistique de sondage [ par anis82 ]
proposition d'un probléme on a une fiche d'évaluation de formation qu'on veut réaliser une statistique ou les résultat doivent étre
Ie 7 et graphique Excel [ par Limbouille ]
Bonjour,J'ai un problème de compatibilité avec des graphiques Excel et internet explorer 7.J'ai crée des pages web depuis des fichiers excel, generé a
Creation d'un graphique [ par errahmouninawal ]
Bonjour tout le monde ;Je veux créer un graphique 'Statistique' à partir des données MySQL qui s'affiche dans une page webj'ai déjà consulter les solu
probleme avec graph ?urgent!! [ par lune2009 ]
Bonjour mon graph n affiche ni les donnes d'histogramme ni les donnes d'axe X. je sais pas d ou vient le probleme? Voici mon code : <?php require_o
Problème avec un lien dans un envoi mail [ par chatis ]
Bonjour,Voilà 3 jours que je me casse la tête avec ça !!! je dois envoyer un lien de payement saferpay par e-mail, mais dans le lien, dans la partie s
generer un graphique grace au resultat d'un sondage [ par agnes05 ]
Je dois generer a partir des resultats obtenu par un formulaire des graphiques mais je ne sais pas trop comment m'y prendre.merci d'avance
creation de graphique [ par agnes05 ]
je narrive pas a faire apparaitre une photos creer avec gd... et mon code n'a pas d'erreur. je crois que le probleme vient de la facon dont je l'appel
|
Derniers Blogs
SQL SERVER : QUERY NOTIFICATION OU COMMENT êTRE NOTIFIé DE MODIFICATIONS DE DONNéES CôTé APPLICATIONSQL SERVER : QUERY NOTIFICATION OU COMMENT êTRE NOTIFIé DE MODIFICATIONS DE DONNéES CôTé APPLICATION par christian
Cette fonctionnalité à vue le jour dans Ado.Net 2.0 et s'appuie sur SQL Server 2005 (et plus) même si elle fonctionne avec SQL Server 2000. Le principe de fonctionnement côté applicatif est assez simple, on fournit une requête et lorsque le résultat d...
Cliquez pour lire la suite de l'article par christian [WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL?[WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL? par JeremyJeanson
Certain d'entre vous on peut être vécu cette situation embarrassante après quelques temps passer avec WF4 : Au début avec mon " ActivityDesigner" , tout allait bien. Et puis un jour j'ai au des problèmes de " Binding" . Alors nous sommes allé sur le site ...
Cliquez pour lire la suite de l'article par JeremyJeanson MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ?MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ? par junarnoalg
La prochaine session de MyTIC aura lieu à Namur, le 23 mars prochain. Pendant presque une heure, nous parlerons de SharePoint 2010. Voici un aperçu du programme.
Accueil : 17h30 Début de la session : 18h00 - Les nouvelles int...
Cliquez pour lire la suite de l'article par junarnoalg [MIX10] KEYNOTE DEUXIèME JOURNéE - INTERNET EXPLORER 9, HTML5, VISUAL STUDIO 2010, ODATA[MIX10] KEYNOTE DEUXIèME JOURNéE - INTERNET EXPLORER 9, HTML5, VISUAL STUDIO 2010, ODATA par cyril
Le deuxième keynote du mix fut très riche en contenu. Internet Explorer 9 Juste un après le lancement de Internet Explorer 8, Microsoft a dévoilé les nouveautés de Internet Explorer 9. Désormais, IE supportera HTML5, SVG et CSS3. L'élément ...
Cliquez pour lire la suite de l'article par cyril
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|