打造超酷的PHP数据饼图

时间:2008-12-11 10:17:15   来源:第二电脑网上收集  作者:第二电脑网

  第二电脑网导读:src="http://file.chinahtml.com/programming/2/2007-02-03/cc918b58863bd4a6b5e50f3fa2595cd6.gif" onclick="function anonymous(){if(!this.resized) {return true;} else {window.open('http://cimg2.163.com/catchpic/1/13/134F99FF33B4336DA2E2E715ECDCF712.gif');}}" onmouseover="function onmouseover(event) { function anonymous() { if (this.width > screen....
  正文:
SEOver="function onmouseover(event) { function anonymous() { if (this.width > screen.width * 0.7) { this.resized = true; this.width = screen.width * 0.7; this.style.cursor = "hand"; this.alt = "Click here to open new window/nCTRL+Mouse wheel to zoom in/out"; } } }" onmousewheel="function anonymous(){return imgzoom(this);}" />

代码


PHP代码如下:

//+------------------------+ 
//| 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 0
333 
$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(30, 10, 20, 20, 10, 20, 10, 20); //数据 
$labLst = array("中国科技大学", "安徽理工大学", "清华大学", "北京大学", "南京大学", "上海大学", "河海大学", "中山大学"); //标签 
$clrLst = array(0x99ff00, 0xff6666, 0x0099ff, 0xff99ff, 0xffff99, 0x99ffff, 0xff3333, 0x009999); 

//画图 
draw_img($datLst,$labLst,$clrLst); 
?> 


来源:http://www.002pc.com/master/College/Programming/PHP/2008-11-27/4079.html

收藏到:

关于《打造超酷的PHP数据饼图》文章的评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面

随机文章

    SQL Error: select * from ***_ecms_article where classid='86' and checked=1 order by rand() limit 10

顶出来的热门

    SQL Error: select * from ***_ecms_article where classid='86' and checked=1 order by diggtop desc,id desc limit 10
站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td