Siempre he querido publicar algo. Acabo de terminar php_gd.dll en php4 recientemente y no puedo esperar a crear algunos programas de gráficos para jugar. Vi muchos ejemplos de cómo hacer gráficos circulares en PHP y, después de verlos, todos eran bidimensionales, así que quería hacer uno tridimensional. Después de un arduo trabajo, se completa pie3d y las cosas buenas se comparten con todos. Sin embargo, soy nuevo en PHP y es posible que el código no esté lo suficientemente refinado. Espero que todos puedan darme algún consejo y trabajar juntos para mejorar este programa. Recuerda notificarme ( [email protected] )
+------------------------+
| pie3dfun.php//Funciones públicas|
+-----------------------+
define("ANGLE_STEP",5);//Define el paso del ángulo al dibujar un arco elíptico
función chx_getdarkcolor($img,$clr){//Encuentra el color oscuro correspondiente a $clr
$rgb=imagecolorsforindex($img,$clr);
return matriz($rgb["rojo"]/2,$rgb["verde"]/2,$rgb["azul"]/2);
}
function chx_getexy($a,$b,$d){//Encuentra las coordenadas del punto en la elipse correspondiente al ángulo $d
$d=grado2rad($d);
return matriz(ronda($a*Cos($d)),ronda($b*Sin($d)));
}
función chx_arc($img,$ox,$oy,$a,$b,$sd,$ed,$clr){//Función de arco elíptico
$n=ceil(($ed-$sd)/ANGLE_STEP);
$d=$sd;
lista($x0,$y0)=chx_getexy($a,$b,$d);
para($i=0;$i<$n;$i++){
$d=($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP);
lista($x,$y)=chx_getexy($a,$b,$d);
imageline($img,$x0+$ox,$y0+$oy,$x+$ox,$y+$oy,$clr);
$x0=$x;
$y0=$y;
}
}
función chx_sector($img,$ox,$oy,$a,$b,$sd,$ed,$clr){//Dibujar un sector
$n=ceil(($ed-$sd)/ANGLE_STEP);
$d=$sd;
lista($x0,$y0)=chx_getexy($a,$b,$d);
imageline($img,$x0+$ox,$y0+$oy,$ox,$oy,$clr);
para($i=0;$i<$n;$i++){
$d=($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP);
lista($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);
lista($x,$y)=chx_getexy($a/2,$b/2,($d+$sd)/2);
imagefill($img,$x+$ox,$y+$oy,$clr);
}
función chx_sector3d($img,$ox,$oy,$a,$b,$v,$sd,$ed,$clr){//sector 3d
chx_sector($img,$ox,$oy,$a,$b,$sd,$ed,$clr);
si($sd<180){
lista($R,$G,$B)=chx_getdarkcolor($img,$clr);
$clr=imagecolorallocate($img,$R,$G,$B);
si($ed>180) $ed=180;
lista($sx,$sy)=chx_getexy($a,$b,$sd);
$sx+=$buey;
$sy+=$oy;
lista($ex,$ey)=chx_getexy($a,$b,$ed);
$ex+=$buey;
$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);
lista($sx,$sy)=chx_getexy($a,$b,($sd+$ed)/2);
$sy+=$oy+$v/2;
$sx+=$buey;
imagefill($img,$sx,$sy,$clr);
}
}
función chx_getindexcolor($img,$clr){//RBG para indexar el color
$R=($clr>>16) & 0xff;
$G=($clr>>8)& 0xff;
$B=($clr) & 0xff;
devolver imagencolorallocate($img,$R,$G,$B);
}
?>
+--------------------------+
| pie3d.php //Archivo de gráfico circular tridimensional |
+--------------------+
require("pie3dfun.php");
$a=150;//Elipse semieje mayor
$b=50;//Semieje del segmento de elipse
$v=20;//altura del pastel redondo
$font=5;//Fuente
$ox=5+$a;
$oy=5+$b;
$fw=imagefontwidth($fuente);
$fh=imagefontheight($fuente);
$datLst=array(30,10,20,20,10,20,10,20);//datos
$labLst=array("a1","a2","a3","a4","a5","a6","a7","a8");//etiqueta
$clrLst=array(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);
//Convierte RGB a color de índice
para($i=0;$i
$clrbk=imagecolorallocate($img,0xff,0xff,0xff);
$clrt=imagecolorallocate($img,0x00,0x00,0x00);
//rellenar color de fondo
imagefill($img,0,0,$clrbk);
//Suma
$tot=0;
para($i=0;$i
$sd=0;
$ed=0;
$ly=10+$b*2+$v;
para($i=0;$i $sd=$ed;
$ed+=$datLst[$i]/$tot*360;
//Dibuja un pastel redondo
chx_sector3d($img,$ox,$oy,$a,$b,$v,$sd,$ed,$clrLst[$i]);//$sd,$ed,$clrLst[$i]);
//Dibujar etiquetas
imagefilledrectangle($img,5,$ly,5+$fw,$ly+$fh,$clrLst[$i]);
imagerectangle($img,5,$ly,5+$fw,$ly+$fh,$clrt);
cadena de imagen($img,$fuente,5+2*$fw,$ly,
$labLst[$i].":".$datLst[$i]."(".(round(10000*($datLst[$i]/$tot))/100)."%)",
$clrt);
$ly+=$fh+2;
}
//gráficos de salida
encabezado("Tipo de contenido:imagen/gif");
img
);