Ext教程 arrow PHP及相关技术 arrow 打造超酷的PHP数据饼图
 
     
打造超酷的PHP数据饼图
  2008-05-06


//+------------------------+ 
//| pie3dfun.PHP//公用函数 | 
//+------------------------+ 

define("ANGLE_STEP"5); //定义画椭圆弧时的角度步长 

function draw_getdarkcolor($img,$clr//求$clr对应的暗色 

$rgb imagecolorsforindex($img,$clr); 
return array(
$rgb["red"]/2,$rgb["green"]/2,$rgb["blue"]/2); 


function 
draw_getexy($a$b$d//求角度$d对应的椭圆上的点坐标 

$d deg2rad($d); 
return array(
round($a*Cos($d)), round($b*Sin($d))); 


function 
draw_arc($img,$ox,$oy,$a,$b,$sd,$ed,$clr//椭圆弧函数 

$n ceil(($ed-$sd)/ANGLE_STEP); 
$d $sd
list(
$x0,$y0) = draw_getexy($a,$b,$d); 
for(
$i=0$i<$n$i++) 

$d = ($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP); 
list(
$x$y) = draw_getexy($a$b$d); 
imageline($img$x0+$ox$y0+$oy$x+$ox$y+$oy$clr); 
$x0 $x
$y0 $y



function 
draw_sector($img$ox$oy$a$b$sd$ed$clr//画扇面 

$n ceil(($ed-$sd)/ANGLE_STEP); 
$d $sd
list(
$x0,$y0) = draw_getexy($a$b$d); 
imageline($img$x0+$ox$y0+$oy$ox$oy$clr); 
for(
$i=0$i<$n$i++) 

$d = ($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP); 
list(
$x$y) = draw_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); 
list(
$x$y) = draw_getexy($a/2$b/2, ($d+$sd)/2); 
imagefill($img$x+$ox$y+$oy$clr); 


function 
draw_sector3d($img$ox$oy$a$b$v$sd$ed$clr//3d扇面 

draw_sector($img$ox$oy$a$b$sd$ed$clr); 
if(
$sd<180

list(
$R$G$B) = draw_getdarkcolor($img$clr); 
$clr=imagecolorallocate($img$R$G$B); 
if(
$ed>180$ed 180
list(
$sx$sy) = draw_getexy($a,$b,$sd); 
$sx += $ox
$sy += $oy
list(
$ex$ey) = draw_getexy($a$b$ed); 
$ex += $ox
$ey += $oy
imageline($img$sx$sy$sx$sy+$v$clr); 
imageline($img$ex$ey$ex$ey+$v$clr); 
draw_arc($img$ox$oy+$v$a$b$sd$ed$clr); 
list(
$sx$sy) = draw_getexy($a$b, ($sd+$ed)/2); 
$sy += $oy+$v/2
$sx += $ox
imagefill($img$sx$sy$clr); 

}
function 
draw_getindexcolor($img$clr//RBG转索引色 


$R = ($clr>>16) & 0xff
$G = ($clr>>8)& 0xff
$B = ($clr) & 0xff
return 
imagecolorallocate($img$R$G$B); 


// 绘图主函数,并输出图片 
// $datLst 为数据数组, $datLst 为标签数组, $datLst 为颜色数组 
// 以上三个数组的维数应该相等 
function draw_img($datLst,$labLst,$clrLst,$a=250,$b=120,$v=20,$font=10

$ox 5+$a
$oy 5+$b
$fw imagefontwidth($font); 
$fh imagefontheight($font); 

$n count($datLst);//数据项个数 

$w 10+$a*2
$h 10+$b*2+$v+($fh+2)*$n

$img imagecreate($w$h); 

//转RGB为索引色 
for($i=0$i<$n$i++) 
$clrLst[$i] = draw_getindexcolor($img,$clrLst[$i]); 

$clrbk imagecolorallocate($img0xff0xff0xff); 
$clrt imagecolorallocate($img0x000x000x00); 

//填充背景色 
imagefill($img00$clrbk); 

//求和 
$tot 0
for(
$i=0$i<$n$i++) 
$tot += $datLst[$i]; 
$sd 0
$ed 0333 
$ly 
10+$b*2+$v
for(
$i=0$i<$n$i++) 

$sd $ed
$ed += $datLst[$i]/$tot*360

//画圆饼 
draw_sector3d($img$ox$oy$a$b$v$sd$ed$clrLst[$i]); //$sd,$ed,$clrLst[$i]); 

//画标签 
imagefilledrectangle($img5$ly5+$fw$ly+$fh$clrLst[$i]); 
imagerectangle($img5$ly5+$fw$ly+$fh$clrt); 
//imagestring($img, $font, 5+2*$fw, $ly, $labLst[$i].":".$datLst[$i]."(".(round(10000*($datLst[$i]/$tot))/100)."%)", $clrt); 

$str iconv("GB2312""UTF-8"$labLst[$i]); 
ImageTTFText($img$font05+2*$fw$ly+13$clrt"./simsun.ttf"$str.":".$datLst[$i]."(".(round(10000*($datLst[$i]/$tot))/100)."%)"); 
$ly += $fh+2


//输出图形 
header("Content-type: image/png"); 

//输出生成的图片 
$imgFileName "../temp/".time().".png"
imagepng($img,$imgFileName); 
echo 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 


$datLst = array(3010202010201020); //数据 
$labLst = array("中国科技大学""安徽理工大学""清华大学""北京大学""南京大学""上海大学""河海大学""中山大学"); //标签 
$clrLst = array(0x99ff000xff66660x0099ff0xff99ff0xffff990x99ffff0xff33330x009999); 

//画图 
draw_img($datLst,$labLst,$clrLst); 
?>
< 上一篇   下一篇 >
   
 
 
 
Copyright Infotmation overhere. | designed by Magicbox from Mambochina
曼波整站系统 基于 Mambo 开发,是免费的自由软件,遵循 GNU/GPL 开源许可协议。
曼波整站系统5.4.0Mambo中国Mambo Resource 联合增强开发。  闽ICP备08005204号