J'ai toujours voulu publier quelque chose. Je viens de terminer récemment php_gd.dll en php4 et j'ai hâte de créer des programmes graphiques avec lesquels jouer. J'ai vu de nombreux exemples de création de diagrammes circulaires en PHP, et après les avoir regardés, ils étaient tous en 2 dimensions, j'ai donc voulu en créer un en 3 dimensions. Après un travail acharné, pie3d est terminé et les bonnes choses sont partagées avec tout le monde. Cependant, je suis nouveau sur PHP et le code n'est peut-être pas suffisamment affiné. J'espère que tout le monde pourra me donner des conseils et travailler ensemble pour améliorer ce programme. N'oubliez pas de me prévenir ( [email protected] )
+----------------------------+
| pie3dfun.php//Fonctions publiques|
+------------------------+
définir("ANGLE_STEP",5);//Définir le pas d'angle lors du dessin d'un arc elliptique
function chx_getdarkcolor($img,$clr){//Trouver la couleur sombre correspondant à $clr
$rgb=imagecolorsforindex($img,$clr);
return array($rgb["red"]/2,$rgb["green"]/2,$rgb["blue"]/2);
}
function chx_getexy($a,$b,$d){//Trouver les coordonnées du point sur l'ellipse correspondant à l'angle $d
$d=deg2rad($d);
return array(round($a*Cos($d)),round($b*Sin($d)));
}
fonction chx_arc($img,$ox,$oy,$a,$b,$sd,$ed,$clr){//fonction arc elliptique
$n=ceil(($ed-$sd)/ANGLE_STEP);
$d=$sd;
liste($x0,$y0)=chx_getexy($a,$b,$d);
pour($i=0;$i<$n;$i++){
$d=($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP);
liste($x,$y)=chx_getexy($a,$b,$d);
imageline($img,$x0+$ox,$y0+$oy,$x+$ox,$y+$oy,$clr);
$x0=$x ;
$y0=$y;
}
}
function chx_sector($img,$ox,$oy,$a,$b,$sd,$ed,$clr){//Dessiner un secteur
$n=ceil(($ed-$sd)/ANGLE_STEP);
$d=$sd;
liste($x0,$y0)=chx_getexy($a,$b,$d);
imageline($img,$x0+$ox,$y0+$oy,$ox,$oy,$clr);
pour($i=0;$i<$n;$i++){
$d=($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP);
liste($x,$y)=chx_getexy($a,$b,$d);
imageline($img,$x0+$ox,$y0+$oy,$x+$ox,$y+$oy,$clr);
$x0=$x ;
$y0=$y;
}
imageline($img,$x0+$ox,$y0+$oy,$ox,$oy,$clr);
liste($x,$y)=chx_getexy($a/2,$b/2,($d+$sd)/2);
imagefill($img,$x+$ox,$y+$oy,$clr);
}
fonction chx_sector3d($img,$ox,$oy,$a,$b,$v,$sd,$ed,$clr){//secteur 3D
chx_sector($img,$ox,$oy,$a,$b,$sd,$ed,$clr);
si($sd<180){
list($R,$G,$B)=chx_getdarkcolor($img,$clr);
$clr=imagecolorallocate($img,$R,$G,$B);
si($ed>180) $ed=180 ;
liste($sx,$sy)=chx_getexy($a,$b,$sd);
$sx+=$bœuf;
$sy+=$oy;
list($ex,$ey)=chx_getexy($a,$b,$ed);
$ex+=$bœuf;
$ey+=$oy;
imageline($img,$sx,$sy,$sx,$sy+$v,$clr);
imageline($img,$ex,$ey,$ex,$ey+$v,$clr);
chx_arc($img,$ox,$oy+$v,$a,$b,$sd,$ed,$clr);
list($sx,$sy)=chx_getexy($a,$b,($sd+$ed)/2);
$sy+=$oy+$v/2;
$sx+=$bœuf;
imagefill($img,$sx,$sy,$clr);
}
}
fonction chx_getindexcolor($img,$clr){//RBG pour indexer la couleur
$R=($clr>>16) & 0xff;
$G=($clr>>8)& 0xff;
$B=($clr) & 0xff;
return imagecolorallocate($img,$R,$G,$B);
}
?>
+----------------+
pie3d.php //Fichier de diagramme circulaire en trois dimensions |
+-------------------------------+
require("pie3dfun.php");
$a=150;//Demi-axe majeur d'Ellipse
$b=50;//Demi-axe du segment d'ellipse
$v=20;//hauteur du gâteau rond
$font=5;//Police
$ox=5+$a;
$oy=5+$b;
$fw=imagefontwidth($font);
$fh=imagefontheight($font);
$datLst=array(30,10,20,20,10,20,10,20);//données
$labLst=array("a1","a2","a3","a4","a5","a6","a7","a8");//étiquette
$clrLst=tableau(0x99ff00,0xff6666,0x0099ff,0xff99ff,0xffff99,0x99ffff,0xff3333,0x009999
$w=10+$a*2);
$h=10+$b*2+$v+($fh+2)*count($datLst);
$img=imagecreate($w,$h);
//Convertir RVB en couleur d'indexation
;
pour($i=0;$i
$clrbk=imagecolorallocate($img,0xff,0xff,0xff);
$clrt=imagecolorallocate($img,0x00,0x00,0x00);
//remplir la couleur d'arrière-plan
imagefill($img,0,0,$clrbk);
//Somme
$tot=0 ;
pour($i=0;$i
$sd=0 ;
$ed=0;
$ly=10+$b*2+$v;
pour($i=0;$i $sd=$ed;
$ed+=$datLst[$i]/$tot*360;
//Dessine un gâteau rond
chx_sector3d($img,$ox,$oy,$a,$b,$v,$sd,$ed,$clrLst[$i]);//$sd,$ed,$clrLst[$i]);
//Dessiner des étiquettes
imagefilledrectangle($img,5,$ly,5+$fw,$ly+$fh,$clrLst[$i]);
imagerectangle($img,5,$ly,5+$fw,$ly+$fh,$clrt);
imagestring($img,$font,5+2*$fw,$ly,
$labLst[$i].":".$datLst[$i]."(".(round(10000*($datLst[$i]/$tot))/100)."%)",
$clrt);
$ly+=$fh+2;
}
//graphiques de sortie
header("Type de contenu:image/gif");
imagegif
($img);