Home > Backend Development > PHP Tutorial > Implementation of 3-dimensional pie chart in php_PHP tutorial

Implementation of 3-dimensional pie chart in php_PHP tutorial

WBOY
Release: 2016-07-13 17:36:07
Original
911 people have browsed it

I’ve always wanted to post something. I have just finished php_gd.dll in php4 recently, and I can’t wait to make some graphics programs to play with. I saw many examples of making pie charts in PHP, and they were all 2-dimensional, so I wanted to make a 3-dimensional one. After hard work, pie3d is completed, and the good stuff is shared with everyone. However, I am new to PHP and the code may not be refined enough. I hope everyone can give me some advice and work together to improve this program. Remember to notify me (estorm@yeah.net)

+------------------------+
| pie3dfun.php//Public functions|
+----- ------------------+

define("ANGLE_STEP",5);//Define the angle step when drawing an elliptical arc
function chx_getdarkcolor($img,$clr){//Find the dark color corresponding to $clr
$rgb= imagecolorsforindex($img,$clr);
return array($rgb["red"]/2,$rgb["green"]/2,$rgb["blue"]/2);
}

function chx_getexy($a,$b,$d){//Find the point coordinates on the ellipse corresponding to angle $d
$d=deg2rad($d);
return array(round($ a*Cos($d)),round($b*Sin($d)));
}

function chx_arc($img,$ox,$oy,$a,$b,$sd,$ed,$clr){//Elliptic arc function
$n=ceil(($ed-$sd )/ANGLE_STEP);
$d=$sd;
list($x0,$y0)=chx_getexy($a,$b,$d);
for($i=0;$i< ;$n;$i++){
$d=($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP);
list($x,$y)=chx_getexy($ a,$b,$d);
imageline($img,$x0+$ox,$y0+$oy,$x+$ox,$y+$oy,$clr);
$x0=$x;
$y0=$y;
}
}
function chx_sector($img,$ox,$oy,$a,$b,$sd,$ed,$clr){// Draw a fan
$n=ceil(($ed-$sd)/ANGLE_STEP);
$d=$sd;
list($x0,$y0)=chx_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)=chx_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)=chx_getexy($ a/2,$b/2,($d+$sd)/2);
imagefill($img,$x+$ox,$y+$oy,$clr);
}

function chx_sector3d($img,$ox,$oy,$a,$b,$v,$sd,$ed,$clr){//3d sector
chx_sector($img,$ox,$ oy,$a,$b,$sd,$ed,$clr);
if($sd<180){
list($R,$G,$B)=chx_getdarkcolor($img,$ clr);
$clr=imagecolorallocate($img,$R,$G,$B);
if($ed>180) $ed=180;
list($sx,$sy) =chx_getexy($a,$b,$sd);
$sx+=$ox;
$sy+=$oy;
list($ex,$ey)=chx_getexy($a,$b ,$ed);
$ex+=$ox;
$ey+=$oy;
imageline($img,$sx,$sy,$sx,$sy+$v,$clr);
imageline($img,$ex,$ey,$ex,$ey+$v,$clr);
chx_arc($img,$ox,$oy+$v,$a,$b,$sd, $ed,$clr);
list($sx,$sy)=chx_getexy($a,$b,($sd+$ed)/2);
$sy+=$oy+$v/2;
$sx+=$ox;
imagefill($img,$sx,$sy,$clr);
}
}

function chx_getindexcolor($img,$clr){//RBG to index color
$R=($clr>>16) & 0xff;
$G=($clr>>8) & 0xff;
$B=($clr) & 0xff;
return imagecolorallocate($img,$R,$G,$B);
}

?>

+--------------------------+
| pie3d.php //Three-dimensional pie chart file|
+- -----------------------+

require("pie3dfun.php");

$a=150;//The semi-major axis of the ellipse
$b=50;//The semi-axis of the ellipse segment
$v=20;//Height of the round cake
$font=5;/ /Font

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


$datLst=array(30,10,20,20,10,20,10,20);//Data
$labLst=array("a1","a2","a3" ,"a4","a5","a6","a7","a8");//Tag
$clrLst=array(0x99ff00,0xff6666,0x0099ff,0xff99ff,0xffff99,0x99ffff,0xff3333,0x009999);

$w=10+$a*2;
$h=10+$b*2+$v+($fh+2)*count($datLst);

$img=imagecreate($w,$h);

//Convert RGB to index color
for($i=0;$i
$clrbk=imagecolorallocate($img,0xff,0xff,0xff);
$clrt=imagecolorallocate($img ,0x00,0x00,0x00);
//Fill the background color
imagefill($img,0,0,$clrbk);
//Sum
$tot=0;
for($i=0;$i
$sd=0;
$ed=0;
$ly=10+$b*2+$v;
for($i=0 ;$i $sd=$ed;
$ed+=$datLst[$i]/$tot*360;
//Draw a round cake
chx_sector3d($img,$ox,$oy,$ a,$b,$v,$sd,$ed,$clrLst[$i]);//$sd,$ed,$clrLst[$i]);
//Draw label
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);
$ly+=$fh+2;
}
//Output graphics
header("Content-type:image/gif");
imagegif($img);

?>

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/508278.htmlTechArticleI’ve always wanted to publish something. I have just finished php_gd.dll in php4 recently, and I can’t wait to make some graphics programs to play with. I saw many examples of making pie charts in PHP, and after looking at them, they were all 2-dimensional, so...
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template