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
MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLETECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLE par ROMELARD Fabrice
Speakers: Julien Marechal, Gautier Confiant, Sébastien MEYER La session débute par le positionnement de la solution System Center par rapport aux concepts d'organisation ITIL. Le portail du catalogue de se...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|