Les camemberts 3d

Soyez le premier à donner votre avis sur cette source.

Vue 26 944 fois - Téléchargée 2 804 fois

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 / Exemple :


<?
/*
 - 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.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
2
Date d'inscription
mardi 16 novembre 2010
Statut
Membre
Dernière intervention
11 mai 2011

Bonjour,

Je ne comprend pas une chose s'il vous plais ...
Tous les scripts GD pour générer un graphe sur le net tel que celui-ci finissent par un ECHO pour afficher celui-ci.

Moi je voudrais enregistrer l'image dans un fichier image sur le ddur pour la re-utiliser derrière dans un pdf ou autre ...
Comment faire pour enregistrer cet echo ?

Prendre :
echo "
";

Et en avoir à la place un .PNG dans le dossier en cour pour l'afficher plustard.

Merci
Messages postés
11
Date d'inscription
lundi 11 mai 2009
Statut
Membre
Dernière intervention
4 octobre 2010

Bonjour!
J'utilise le code de l'exemple inclus dans le ZIP nommé moncamembert.php.
Je voulais savoir si il était possible de ne pas prendre en compte les données égales à 0.

Merci de votre aide
Messages postés
147
Date d'inscription
lundi 16 août 2004
Statut
Membre
Dernière intervention
14 novembre 2009

Bonjour!
L'adresse de mon dernier camembert (crémeux et moelleux bien comme il faut!) :
http://www.javascriptfr.com/codes/SVG3DCAMEMBERT_46033.aspx
a++
Messages postés
117
Date d'inscription
dimanche 7 avril 2002
Statut
Membre
Dernière intervention
23 octobre 2013

tout simplement extra , j'avais presque abandonné l'idée d'en utiliser tellement que c'était long à étudier ses graph
Messages postés
147
Date d'inscription
lundi 16 août 2004
Statut
Membre
Dernière intervention
14 novembre 2009

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
Afficher les 26 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.