本站最近一段时间在改版,如果你在浏览的过程中遇到无法访问的情况,还请见谅! [07-05-07 0:49:25]
当前位置:首 页 >> 网络编程 >> PHP >> PHP对象编程实现3D饼图






<?php 

//公用函数 

//把角度转换为弧度 
function deg2Arc( $degrees) { 
return( $degrees * (pi()/180.0)); 


//RGB 
function getRGB( $color){ 
 $R=( $color>>16) & 0xff; 
 $G=( $color>>8) & 0xff; 
 $B=( $color) & 0xff; 
return (array( $R, $G, $B)); 


// 取得在椭圆心为(0,0)的椭圆上 x,y点的值 
function pie_point( $deg, $va, $vb){ 
 $x= cos(deg2Arc( $deg)) *  $va; 
 $y= sin(deg2Arc( $deg)) *  $vb; 
return (array( $x,  $y)); 



//3D饼图类 

class Pie3d{ 

var  $a; //椭圆长半轴 
var  $b; //椭圆短半轴 
var  $DataArray; //每个扇形的数据 
var  $ColorArray; //每个扇形的颜色 要求按照十六进制书写但前面不加0x 
//为边缘及阴影为黑色 

function Pie3d( $pa=100, $pb=60, $sData="100,200,300,400,500",  $sColor="ee00ff,dd0000,cccccc,ccff00,00ccff") 

 $this->a= $pa; 
 $this->b= $pb; 
 $this->DataArray=split(",", $sData); 
 $this->ColorArray=split(",", $sColor); 


function setA( $v){ 
 $this->a= $v; 


function getA(){ 
return  $this->a; 


function setB( $v){ 
 $this->b= $v; 


function getB(){ 
return  $this->b; 


function setDataArray( $v){ 
 $this->DataArray=split(",", $v); 


function getDataArray( $v){ 
return  $this->DataArray; 


function setColorArray( $v){ 
 $this->ColorArray=split(",", $v); 


function getColorArray(){ 
return  $this->ColorArray; 



function DrawPie(){ 
 $image=imagecreate( $this->a*2+40, $this->b*2+40); 
 $PieCenterX= $this->a+10; 
 $PieCenterY= $this->b+10; 
 $DoubleA= $this->a*2; 
 $DoubleB= $this->b*2; 
list( $R, $G, $B)=getRGB(0); 
 $colorBorder=imagecolorallocate( $image, $R, $G, $B); 
 $DataNumber=count( $this->DataArray); 

// $DataTotal 
for( $i=0; $i< $DataNumber; $i++)  $DataTotal+= $this->DataArray[ $i]; //算出数据和 

//填充背境 
imagefill( $image, 0, 0, imagecolorallocate( $image, 0xFF, 0xFF, 0xFF)); 

/* 
** 画每一个扇形 
*/ 
 $Degrees = 0; 
for( $i = 0;  $i <  $DataNumber;  $i++){ 
 $StartDegrees = round( $Degrees); 
 $Degrees += (( $this->DataArray[ $i]/ $DataTotal)*360); 
 $EndDegrees = round( $Degrees); 
 $percent = number_format( $this->DataArray[ $i]/ $DataTotal*100, 1); 
list( $R, $G, $B)=getRGB(hexdec( $this->ColorArray[ $i])); 
 $CurrentColor=imagecolorallocate( $image, $R, $G, $B); 
if ( $R>60 and  $R<256)  $R= $R-60; 
if ( $G>60 and  $G<256)  $G= $G-60; 
if ( $B>60 and  $B<256)  $B= $B-60; 
 $CurrentDarkColor=imagecolorallocate( $image, $R, $G, $B); 
//画扇形弧 
imagearc( $image, $PieCenterX, $PieCenterY, $DoubleA, $DoubleB, $StartDegrees, $EndDegrees, $CurrentColor); 
//画直线 
list( $ArcX,  $ArcY) = pie_point( $StartDegrees ,  $this->a ,  $this->b); 
imageline( $image, $PieCenterX, $PieCenterY,floor( $PieCenterX +  $ArcX),floor( $PieCenterY +  $ArcY), $CurrentColor); 
//画直线 
list( $ArcX,  $ArcY) = pie_point( $EndDegrees, $this->a ,  $this->b); 
imageline( $image, $PieCenterX, $PieCenterY,ceil( $PieCenterX +  $ArcX),ceil( $PieCenterY +  $ArcY), $CurrentColor); 
//填充扇形 
 $MidPoint = round((( $EndDegrees -  $StartDegrees)/2) +  $StartDegrees); 
list( $ArcX,  $ArcY) = Pie_point( $MidPoint,  $this->a*3/4 ,  $this->b*3/4); 

imagefilltoborder( $image,floor( $PieCenterX +  $ArcX),floor( $PieCenterY +  $ArcY),  $CurrentColor, $CurrentColor); 
imagestring( $image,2,floor( $PieCenterX +  $ArcX-5),floor( $PieCenterY +  $ArcY-5), $percent."%", $colorBorder); 

//画阴影 
if ( $StartDegrees>=0 and  $StartDegrees<=180){ 
if( $EndDegrees<=180){ 
for( $k = 1;  $k < 15;  $k++) 
imagearc( $image, $PieCenterX,  $PieCenterY+ $k, $DoubleA,  $DoubleB,  $StartDegrees,  $EndDegrees,  $CurrentDarkColor); 
}else{ 
for( $k = 1;  $k < 15;  $k++) 
imagearc( $image, $PieCenterX,  $PieCenterY+ $k, $DoubleA,  $DoubleB,  $StartDegrees, 180,  $CurrentDarkColor); 





/*到此脚本已经生了一幅图像了 
**现在需要的是把它发到浏览器上,重要的一点是要将标头发给浏览器,让它知道是一个GIF文件。不然的话你只能看到一堆奇怪的乱码 
*/ 
//输出生成的图片 
header("Content-type: image/gif"); 
imagegif( $image); 
imagedestroy( $image); 
}//End drawPie() 
}//End class 


//实现 

 $objp = new Pie3d(); 
 $objp->DrawPie(); 
?> 
PHP对象编程实现3D饼图
作者: 发布时间:04-11-22 浏览次数:885 [ ]



相关附件:无 相关文章[]: 下一篇:[04-11-22] PHP调用三种数据库的方法(1) 上一篇:[04-11-22] php录入页面中动态从数据库中提取数据的实现 相关评论:
添加评论