首 页   · 站长博客 · 用户注册 · 会员登陆  · 会员排行  ·最新主题  ·最近回复  精华区  版权声明  ·论坛管理
  当前登录身份:游客,请先登录。  笔名: 口令: 验证码:   
楼 主  index »  PHP与模板与代码加密/优化 » [原创]一个画饼图的程序,出错。求助于大家!  


  作者:cykk
  注册时间:2004-12-30
  主题/回复:41/99
  积分:688
  等级:★★★(六级)
  称号:声名鹊起

  keke9668@263.net..
  272782316
  cyxk.go1.icpcn.com

 

 发表:2006-08-30 18:25:51 阅读 2360 次 回复 0 次 得分0  |   字号 字色
[原创]一个画饼图的程序,出错。求助于大家!
<? //+------------------------+ 
//+------------------------+ 

//| 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($img, 0xff, 0xff, 0xff); 

$clrt = imagecolorallocate($img, 0x00, 0x00, 0x00); 


//填充背景色 

imagefill($img, 0, 0, $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($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); 


$str = iconv("GB2312", "UTF-8", $labLst[$i]); 

ImageTTFText($img, $font, 0, 5+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); 

?>

 
  页数1/1首页 « 1 » 末页
  发表回复:您还没有登陆,无法发表回复。请先[登陆]

一起PHP技术联盟 主办:一起PHP 联系方式:站长QQ:4304410 QQ群:8423742 20159565 站长博客 E-mail: nqp@nqp.me 执行时间:0.015sec
SimsmaBBS 2008 (v6.0) Developed by 17php.com,Copyright(C)2003-2010 All rights reserved. 副本授权:一起PHP官方专用版