|
Trouver une ressource
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 !
UN GRAPHIQUE CAMEMBERT EN 3D
Information sur la source
Description
Il est possible d'éclater les tranches, et de modifier pas mal de choses.
Source
- <?php
-
- $freq=array(15,18,8,10,7,2,1);
- camembert($freq,0,800,400,15,10,1);
-
- //$freq = table des valeurs (1 dimension)
- //$ord = ordre [1=croissant | 2=décroissant]
- //$rm,$rn = rayon max,min de l'ellipse
- //$h = épaisseur
- //$d1 = décalage de la 1ere tranche (en px)
- //$dt = [1=décale ttes les tranches de $d1 px]
-
- function camembert($freq,$ord,$rm,$rn,$h,$d1,$dt)
- {
- if($ord==1) sort($freq);
- if($ord==2) rsort($freq);
- $nb=count($freq);
- $somme=array_sum($freq);
- $im=ImageCreate(intval($rm+$d1*$dt*2+$d1*2+8),intval($rn+$d1*$dt*2+$h*3+8)); //3D
- $white=ImageColorAllocate($im,255,255,255);
- ImageColorTransparent($im,$white);
- $pal=DoubleColorSet($im);
- $im2=ImageCreate(intval($rm+$d1*$dt*2+$d1*2+8),intval($rn+$d1*$dt*2+$h*3+8)); //dessus
- $white=ImageColorAllocate($im2,255,255,255);
- ImageColorTransparent($im2,$white);
- DoubleColorSet($im2);
- for($last=0,$i=0;$i<$nb;$i++)
- {
- $degree=360*($freq[$i]/$somme);
- $col=$pal[(192/($nb+1))*$i];
- ImageFilledArc($im,(ImageSX($im)/2)+($i==0|$dt)*$d1*cos(($last+$degree/2)/360*2*M_PI),(ImageSY($im)/2)+($i==0|$dt)*$d1*sin(($last+$degree/2)/360*2*M_PI)*($rn/$rm*1.5),$rm,$rn,$last,$last+$degree,$col,IMG_ARC_NOFILL&IMG_ARC_EDGED);
- $last+=$degree;
- }
- ImageCopy($im2,$im,0,0,0,0,ImageSX($im),ImageSY($im));
- ImageColorMod($im2,64);
- for($i=0;$i<$h;$i++) //effet 3D en recopiant l'image h fois sur elle même
- ImageCopy($im,$im,0,0,0,1,ImageSX($im),ImageSY($im));
- ImageCopy($im,$im2,0,0,0,$h,ImageSX($im),ImageSY($im));
- drawPNG($im);
- ImageDestroy($im);ImageDestroy($im2);
- }
- function ImageColorMod($im,$mod) //décale les couleurs d'une palette de $mod composantes r v b
- {
- $nb=ImageColorsTotal($im);
- for($i=1;$i<$nb;$i++) //ne prend pas la 1e couleur (généralement le fond en transparent)
- {
- $rvb=ImageColorsForIndex($im,$i);
- if(($mod+$rvb['red'])>255) $rvb['red']=255-$mod;
- if(($mod+$rvb['green'])>255) $rvb['green']=255-$mod;
- if(($mod+$rvb['blue'])>255) $rvb['blue']=255-$mod;
- if(($mod+$rvb['red'])<0) $rvb['red']=-$mod;
- if(($mod+$rvb['green'])<0) $rvb['green']=-$mod;
- if(($mod+$rvb['blue'])<0) $rvb['blue']=-$mod;
- ImageColorSet($im,$i,$mod+$rvb['red'],$mod+$rvb['green'],$mod+$rvb['blue']);
- }
- }
- function DoubleColorSet($im) //192 couleurs
- {
- for($i=0;$i<64;$i++)
- {
- $pal[$i]=ImageColorAllocate($im,0,$i*3,192);
- $pal[$i+64]=ImageColorAllocate($im,$i*3,192-$i*3,192);
- $pal[$i+64*2]=ImageColorAllocate($im,255-$i*4,0,192);
- }
- return($pal);
- }
- function drawPNG($im){static $n;$n++;imagePNG($im,"tmp$n.png");echo"<img src=\"tmp$n.png\">";}
- ?>
<?php
$freq=array(15,18,8,10,7,2,1);
camembert($freq,0,800,400,15,10,1);
//$freq = table des valeurs (1 dimension)
//$ord = ordre [1=croissant | 2=décroissant]
//$rm,$rn = rayon max,min de l'ellipse
//$h = épaisseur
//$d1 = décalage de la 1ere tranche (en px)
//$dt = [1=décale ttes les tranches de $d1 px]
function camembert($freq,$ord,$rm,$rn,$h,$d1,$dt)
{
if($ord==1) sort($freq);
if($ord==2) rsort($freq);
$nb=count($freq);
$somme=array_sum($freq);
$im=ImageCreate(intval($rm+$d1*$dt*2+$d1*2+8),intval($rn+$d1*$dt*2+$h*3+8)); //3D
$white=ImageColorAllocate($im,255,255,255);
ImageColorTransparent($im,$white);
$pal=DoubleColorSet($im);
$im2=ImageCreate(intval($rm+$d1*$dt*2+$d1*2+8),intval($rn+$d1*$dt*2+$h*3+8)); //dessus
$white=ImageColorAllocate($im2,255,255,255);
ImageColorTransparent($im2,$white);
DoubleColorSet($im2);
for($last=0,$i=0;$i<$nb;$i++)
{
$degree=360*($freq[$i]/$somme);
$col=$pal[(192/($nb+1))*$i];
ImageFilledArc($im,(ImageSX($im)/2)+($i==0|$dt)*$d1*cos(($last+$degree/2)/360*2*M_PI),(ImageSY($im)/2)+($i==0|$dt)*$d1*sin(($last+$degree/2)/360*2*M_PI)*($rn/$rm*1.5),$rm,$rn,$last,$last+$degree,$col,IMG_ARC_NOFILL&IMG_ARC_EDGED);
$last+=$degree;
}
ImageCopy($im2,$im,0,0,0,0,ImageSX($im),ImageSY($im));
ImageColorMod($im2,64);
for($i=0;$i<$h;$i++) //effet 3D en recopiant l'image h fois sur elle même
ImageCopy($im,$im,0,0,0,1,ImageSX($im),ImageSY($im));
ImageCopy($im,$im2,0,0,0,$h,ImageSX($im),ImageSY($im));
drawPNG($im);
ImageDestroy($im);ImageDestroy($im2);
}
function ImageColorMod($im,$mod) //décale les couleurs d'une palette de $mod composantes r v b
{
$nb=ImageColorsTotal($im);
for($i=1;$i<$nb;$i++) //ne prend pas la 1e couleur (généralement le fond en transparent)
{
$rvb=ImageColorsForIndex($im,$i);
if(($mod+$rvb['red'])>255) $rvb['red']=255-$mod;
if(($mod+$rvb['green'])>255) $rvb['green']=255-$mod;
if(($mod+$rvb['blue'])>255) $rvb['blue']=255-$mod;
if(($mod+$rvb['red'])<0) $rvb['red']=-$mod;
if(($mod+$rvb['green'])<0) $rvb['green']=-$mod;
if(($mod+$rvb['blue'])<0) $rvb['blue']=-$mod;
ImageColorSet($im,$i,$mod+$rvb['red'],$mod+$rvb['green'],$mod+$rvb['blue']);
}
}
function DoubleColorSet($im) //192 couleurs
{
for($i=0;$i<64;$i++)
{
$pal[$i]=ImageColorAllocate($im,0,$i*3,192);
$pal[$i+64]=ImageColorAllocate($im,$i*3,192-$i*3,192);
$pal[$i+64*2]=ImageColorAllocate($im,255-$i*4,0,192);
}
return($pal);
}
function drawPNG($im){static $n;$n++;imagePNG($im,"tmp$n.png");echo"<img src=\"tmp$n.png\">";}
?>
Conclusion
Je ne vais pas expliquer ce code, c'est plus des maths qu'autre chose ! Seulement un petit détail : la 3D est faite par recopie de l'image $h fois sur elle même, alors ne spécifiez pas une épaisseur trop grande, ou bien ca rique de prendre du temps ;) Dans le zip : camembert.php : génère un camambert avec GD 2 ou + et l'affiche camemberti.php : fonctionne avce toutes versions de GD et la fonction camembert() retourne l'image au lieu de l'afficher ellipses.php : requis pour que camemberti fonctionne (pour image FilledArcPerso())
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
- 22 mars 2005 13:30:00 :
- L'image, s'il vous plait !!
Sources du même auteur
Sources de la même categorie
Sources en rapport avec celle ci
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
gd et la superposition d'images transparentes [ par bizu29 ]
Tout d'abord bonjour/soirAlors j'ai un petit soucis qui commence a me rendre dingue Mon but est de fusionner ces 2 images avec gd <img src="http://biz
A propos de la librairie GD de PHP [ par sertarien2 ]
Bonjour :)Savez-vous si il est possible avec la librairie GD de php de remplir un texte par une texture de remplissage au lieu d'une couleur ?( exempl
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
GD / IMAGECREATE / POLICE [ par robin691781 ]
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
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version

LG KP501
Entre 9€ et 159€
|