php 三维饼图的实现代码


Posted in PHP onSeptember 28, 2008

经过努力pie3d完成了,好东西与大家分享。不过小弟是php新手,代码可能不够精炼,希望大家指教共同来完善这个程序。记得通知我(estorm@yeah.net)
+------------------------+
| pie3dfun.php//公用函数 |
+------------------------+
define("ANGLE_STEP",5);//定义画椭圆弧时的角度步长
function chx_getdarkcolor($img,$clr){//求$clr对应的暗色
$rgb=imagecolorsforindex($img,$clr);
return array($rgb["red"]/2,$rgb["green"]/2,$rgb["blue"]/2);
}
function chx_getexy($a,$b,$d){//求角度$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){//椭圆弧函数
$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){//画扇面
$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扇面
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转索引色
$R=($clr>>16) & 0xff;
$G=($clr>>8)& 0xff;
$B=($clr) & 0xff;
return imagecolorallocate($img,$R,$G,$B);
}
?>
+--------------------------+
| pie3d.php //三维饼图文件 |
+--------------------------+
require("pie3dfun.php");
$a=150;//椭圆长半轴
$b=50;//椭圆段半轴
$v=20;//圆饼高度
$font=5;//字体
$ox=5+$a;
$oy=5+$b;
$fw=imagefontwidth($font);
$fh=imagefontheight($font);

$datLst=array(30,10,20,20,10,20,10,20);//数据
$labLst=array("a1","a2","a3","a4","a5","a6","a7","a8");//标签
$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);
//转RGB为索引色
for($i=0;$i
$clrbk=imagecolorallocate($img,0xff,0xff,0xff);
$clrt=imagecolorallocate($img,0x00,0x00,0x00);
//填充背景色
imagefill($img,0,0,$clrbk);
//求和
$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;
//画圆饼
chx_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);
$ly+=$fh+2;
}
//输出图形
header("Content-type:image/gif");
imagegif($img);
?>

PHP 相关文章推荐
PHP 文章中的远程图片采集到本地的代码
Jul 30 PHP
使用XDebug调试及单元测试覆盖率分析
Jan 27 PHP
php记录日志的实现代码
Aug 08 PHP
PHP获取MAC地址的函数代码
Sep 11 PHP
php解压文件代码实现php在线解压
Feb 13 PHP
PHP+MySQL插入操作实例
Jan 21 PHP
PHP基于单例模式实现的数据库操作基类
Jan 15 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
Jan 18 PHP
PHP下的浮点运算不准的解决方法
Oct 27 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
Aug 14 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
Mar 30 PHP
PHP基于PDO扩展操作mysql数据库示例
Dec 24 PHP
PHP控制网页过期时间的代码
Sep 28 #PHP
PHP集成FCK的函数代码
Sep 27 #PHP
php横向重复区域显示二法
Sep 25 #PHP
php下防止单引号,双引号在接受页面转义的设置方法
Sep 25 #PHP
PHP伪造referer实例代码
Sep 20 #PHP
PHP面向对象分析设计的经验原则
Sep 20 #PHP
php 301转向实现代码
Sep 18 #PHP
You might like
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
共享自己写一个框架DreamScript
2007/01/20 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
基于JS实现发送短信验证码后的倒计时功能(无视页面刷新,页面关闭不进行倒计时功能)
2016/09/02 Javascript
express文件上传中间件Multer详解
2016/10/24 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
详解vue-cli之webpack3构建全面提速优化
2017/12/25 Javascript
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
python3.5仿微软计算器程序
2020/03/30 Python
python判断字符串编码的简单实现方法(使用chardet)
2016/07/01 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
详解Python with/as使用说明
2018/12/13 Python
Python File(文件) 方法整理
2019/02/18 Python
Django使用unittest模块进行单元测试过程解析
2019/08/02 Python
python实现递归查找某个路径下所有文件中的中文字符
2019/08/31 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
2020/02/27 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
基于css3实现漂亮便签样式
2013/03/18 HTML / CSS
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
27个经典Linux面试题及答案,你知道几个?
2013/01/10 面试题
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
石油大学毕业生自荐信
2014/01/28 职场文书
运动会稿件300字
2014/02/14 职场文书
2014年幼儿园教学工作总结
2014/12/04 职场文书
销售会议开幕词
2015/01/28 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书
创业计划书之儿童理发店
2019/09/27 职场文书
Python 制作自动化翻译工具
2021/04/25 Python
PyTorch的Debug指南
2021/05/07 Python
php解析非标准json、非规范json的方式实例
2022/05/10 PHP
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js