ImmortalPC
Messages postés954Date d'inscriptionmardi 11 mai 2004StatutMembreDernière intervention11 novembre 2008
-
8 oct. 2005 à 18:37
darknior
Messages postés2Date d'inscriptionmardi 16 novembre 2010StatutMembreDernière intervention11 mai 2011
-
12 mai 2011 à 09:51
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
darknior
Messages postés2Date d'inscriptionmardi 16 novembre 2010StatutMembreDernière intervention11 mai 2011 12 mai 2011 à 09:51
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
fabien178
Messages postés11Date d'inscriptionlundi 11 mai 2009StatutMembreDernière intervention 4 octobre 2010 4 oct. 2010 à 14:29
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
opossum_farceur
Messages postés147Date d'inscriptionlundi 16 août 2004StatutMembreDernière intervention14 novembre 2009 11 mai 2008 à 00:16
Gallient
Messages postés15Date d'inscriptionvendredi 29 avril 2005StatutMembreDernière intervention 7 novembre 2007 11 juil. 2006 à 11:03
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.
cs_badoux
Messages postés137Date d'inscriptionsamedi 21 février 2004StatutMembreDernière intervention16 décembre 2008 20 juin 2006 à 08:28
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 !:-)
opossum_farceur
Messages postés147Date d'inscriptionlundi 16 août 2004StatutMembreDernière intervention14 novembre 2009 20 juin 2006 à 01:57
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.
cs_badoux
Messages postés137Date d'inscriptionsamedi 21 février 2004StatutMembreDernière intervention16 décembre 2008 19 juin 2006 à 10:49
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 ! :-)
++
ImmortalPC
Messages postés954Date d'inscriptionmardi 11 mai 2004StatutMembreDernière intervention11 novembre 20082 19 juin 2006 à 10:05
Salut,
badoux as tu le lien pour jpowered Graph3D pour voir ce que ça donne.
Merci
@+
cs_badoux
Messages postés137Date d'inscriptionsamedi 21 février 2004StatutMembreDernière intervention16 décembre 2008 18 juin 2006 à 12:34
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 !
opossum_farceur
Messages postés147Date d'inscriptionlundi 16 août 2004StatutMembreDernière intervention14 novembre 2009 18 juin 2006 à 03:04
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.
cs_badoux
Messages postés137Date d'inscriptionsamedi 21 février 2004StatutMembreDernière intervention16 décembre 2008 17 juin 2006 à 10:19
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 :-)
cs_niko14
Messages postés209Date d'inscriptionjeudi 12 janvier 2006StatutMembreDernière intervention10 octobre 2014 13 févr. 2006 à 08:09
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!!!
opossum_farceur
Messages postés147Date d'inscriptionlundi 16 août 2004StatutMembreDernière intervention14 novembre 2009 11 févr. 2006 à 14:46
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 :
".$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'];
}
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.
cs_niko14
Messages postés209Date d'inscriptionjeudi 12 janvier 2006StatutMembreDernière intervention10 octobre 2014 10 févr. 2006 à 08:34
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
opossum_farceur
Messages postés147Date d'inscriptionlundi 16 août 2004StatutMembreDernière intervention14 novembre 2009 14 déc. 2005 à 02:08
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é.
pichpoich
Messages postés26Date d'inscriptionlundi 5 janvier 2004StatutMembreDernière intervention29 janvier 2009 13 déc. 2005 à 18:22
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.
pichpoich
Messages postés26Date d'inscriptionlundi 5 janvier 2004StatutMembreDernière intervention29 janvier 2009 7 déc. 2005 à 22:21
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.
opossum_farceur
Messages postés147Date d'inscriptionlundi 16 août 2004StatutMembreDernière intervention14 novembre 2009 7 déc. 2005 à 20:27
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 , 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.
pichpoich
Messages postés26Date d'inscriptionlundi 5 janvier 2004StatutMembreDernière intervention29 janvier 2009 6 déc. 2005 à 00:09
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.
stepibou
Messages postés112Date d'inscriptionjeudi 11 mars 2004StatutMembreDernière intervention11 octobre 2006 27 nov. 2005 à 17:09
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! ;)
opossum_farceur
Messages postés147Date d'inscriptionlundi 16 août 2004StatutMembreDernière intervention14 novembre 2009 27 nov. 2005 à 16:31
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!
stepibou
Messages postés112Date d'inscriptionjeudi 11 mars 2004StatutMembreDernière intervention11 octobre 2006 27 nov. 2005 à 00:56
salut,
bien bien, tu peux utiliser imagecreatetruecolors à la place de imagecreate.
a+
EMSIEN
Messages postés194Date d'inscriptionlundi 26 juillet 2004StatutMembreDernière intervention11 juin 2009 9 oct. 2005 à 00:06
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
ImmortalPC
Messages postés954Date d'inscriptionmardi 11 mai 2004StatutMembreDernière intervention11 novembre 20082 8 oct. 2005 à 18:37
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);
/* 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);
12 mai 2011 à 09:51
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
4 oct. 2010 à 14:29
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
11 mai 2008 à 00:16
L'adresse de mon dernier camembert (crémeux et moelleux bien comme il faut!) :
http://www.javascriptfr.com/codes/SVG3DCAMEMBERT_46033.aspx
a++
29 avril 2008 à 12:07
28 août 2006 à 01:26
j'ai publié une nouvelle source de camembert, "Smooth 3D Camembert", à l'adresse suivante :
http://www.phpcs.com/codes/SMOOTH-3D-CAMEMBERT_39291.aspx
11 juil. 2006 à 11:03
20 juin 2006 à 08:28
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 !:-)
20 juin 2006 à 01:57
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.
19 juin 2006 à 10:49
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 ! :-)
++
19 juin 2006 à 10:05
badoux as tu le lien pour jpowered Graph3D pour voir ce que ça donne.
Merci
@+
18 juin 2006 à 12:34
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 !
18 juin 2006 à 03:04
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.
17 juin 2006 à 10:19
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 :-)
13 févr. 2006 à 08:09
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!!!
11 févr. 2006 à 14:46
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 :
".$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.
10 févr. 2006 à 08:34
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
14 déc. 2005 à 02:08
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é.
13 déc. 2005 à 18:22
A plus.
7 déc. 2005 à 22:21
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.
7 déc. 2005 à 20:27
Le fichier contenant la fonction "camembert()" ne doit pas contenir de code "html" : donc pas de <html>, de <head> et autre , 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.
6 déc. 2005 à 00:09
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.
27 nov. 2005 à 17:09
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! ;)
27 nov. 2005 à 16:31
- 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!
27 nov. 2005 à 00:56
bien bien, tu peux utiliser imagecreatetruecolors à la place de imagecreate.
a+
9 oct. 2005 à 00:06
juste un vecteur contenant tes statistiques et le tour est joué.
En tout Continue et surtout bonne porg.
http://ntic.blogspirit.com
8 oct. 2005 à 18:37
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
@+