|
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
mise a jour de graph via AJAX? [ par LaTatadu91 ]
Bonjour a tous; voila sur uen de mes pages php je créé un graphique(diagrmme en batons+courbes) a partir de données MYSQL ces d
pb d'inserertion d' images gd dans champ longblob [ par fredericmaill ]
Bonjour @ tous !!! j'ai fais un système d'upload qui enregistre a la fois l'image dans un répertoire de mon serveur et enregistre égal
Image GD et php ! prob d'affichage [ par riecola ]
Bonjour tout le monde. Voilà mon problème : mon utilisateur selectionne une image et un texte au choix dans un formulaire ensuite une page s
Recolorisation d'une image avec la lib. GD [ par fanfouer ]
Bonjour, Je cherche a faire un petit script à l'aide de la librairie GD pour changer les couleurs d'une image que je lui passe à l'aide d'un
Anumation graphique entre 2 pages [ par kleos chaos ]
Bonjour à tous Voyez vous , cela fait pas mal de temps que je cherche ce script et que je ne le trouve pas. J'ai essayer Javascript, php , CSS, r
Générateur de cartes à jouer [ par ZuGbEn ]
Bonjour ! Je suis en train de développer un générateur de cartes à jouer, qui affiche par exemple un 7 de carreau quand on lui de
A propos des images GD [ par ckhalilo ]
j'ai un problème d'integration des image dans un formulaire, pour eviter l'envoie automatique dans mon formulaire bref mon problème est le suivant qu
créer des statistique a partir d une bdd [ par gabs77 ]
bonjour je suis débutant en php et je voudrais savoir comment on réalise des statistiques en histogramme ou en camembert par exemplea partir
|
Téléchargements
Logiciels à télécharger sur le même thème :
|