好早以前看过,地址也保留过,后来找不到了,留一篇备份吧。
 

 


源代码:

 
PHP代码如下:

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

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

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

$rgb p_w_picpathcolorsforindex($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
); 
p_w_picpathline($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
); 
p_w_picpathline($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
); 
p_w_picpathline($img$x0+$ox$y0+$oy$x+$ox$y+$oy$clr
); 
$x0 $x

$y0 $y


p_w_picpathline($img$x0+$ox$y0+$oy$ox$oy$clr
); 
list(
$x$y) = draw_getexy($a/2$b/2, ($d+$sd)/2
); 
p_w_picpathfill($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=p_w_picpathcolorallocate($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

p_w_picpathline($img$sx$sy$sx$sy+$v$clr
); 
p_w_picpathline($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

p_w_picpathfill($img$sx$sy$clr
); 

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


$R = ($clr>>16) & 0xff

$G = ($clr>>8)& 0xff

$B = ($clr) & 0xff

return 
p_w_picpathcolorallocate($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 p_w_picpathfontwidth($font
); 
$fh p_w_picpathfontheight($font
); 

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

$w 10+$a*2

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


$img p_w_picpathcreate($w$h
); 

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

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

//填充背景色 
p_w_picpathfill($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]); 

//画标签 
p_w_picpathfilledrectangle($img5$ly5+$fw$ly+$fh$clrLst[$i
]); 
p_w_picpathrectangle($img5$ly5+$fw$ly+$fh$clrt
); 
//p_w_picpathstring($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: p_w_picpath/png"
); 

//输出生成的图片 
$imgFileName "../temp/".time().".png"

p_w_picpathpng($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); 
?>