Un graphique camembert en 3d

5/5 (34 avis)

Vue 31 797 fois - Téléchargée 2 010 fois


Description

Il est possible d'éclater les tranches, et de modifier pas mal de choses.

Source / Exemple :


<?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())

Codes Sources

A voir également

Ajouter un commentaire Commentaires
crazygogo Messages postés 135 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 17 avril 2009
7 août 2008 à 14:44
nadifa Messages postés 9 Date d'inscription mardi 17 juillet 2007 Statut Membre Dernière intervention 27 juillet 2007
17 juil. 2007 à 18:07
salut je ss nvl ds ce domaine et j'aimerais bien créer le meme j'ai trés bien compris le code le changement que je ve attribuer c'est pouvoir fusionnée deux partitions et mettre 3 pix entre aux cmt je pourais le faire merci si vous pouvais me faire savoir a quoi va ressembler le code pour avoir ces modifications :)
pgpp Messages postés 58 Date d'inscription dimanche 16 mai 2004 Statut Membre Dernière intervention 2 septembre 2004
18 mai 2007 à 06:15
Encore toi ? ;)
Non, plus de modif, et pour les histogrammes y'a déjà 3 tonnes de scripts qui font ça.

Si je réécris ce script, ce sera tellement beau que j'aurai envie de le garder pour moi (bouuh l'égoïste !!) :D
jackie0000 Messages postés 22 Date d'inscription dimanche 24 juillet 2005 Statut Membre Dernière intervention 3 août 2009
22 mars 2007 à 11:48
y aura t il une modif sur l code pour avour graph tels que histogrammes
skaterboss2000 Messages postés 29 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 12 juin 2006
15 févr. 2006 à 12:02
ok, c'est cool :)
Afficher les 34 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.