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分页时出现的Fatal error的解决方法
Apr 18 PHP
PHP之生成GIF动画的实现方法
Jun 07 PHP
深入解析php中的foreach函数
Aug 31 PHP
php文件扩展名判断及获取文件扩展名的N种方法
Sep 12 PHP
windows8.1下Apache+Php+MySQL配置步骤
Oct 30 PHP
使用php实现从身份证中提取生日
May 09 PHP
php中序列化与反序列化详解
Feb 13 PHP
PHP实现负载均衡下的session共用功能
Apr 17 PHP
PHP实现的策略模式示例
Mar 20 PHP
thinkphp5.1框架模板布局与模板继承用法分析
Jul 19 PHP
PHP如何将图片文件上传到另外一台服务器上
Aug 26 PHP
详解no input file specified 三种解决方法
Nov 29 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
探讨Hessian在PHP中的使用分析
2013/06/13 PHP
ThinkPHP内置jsonRPC的缺陷分析
2014/12/18 PHP
php上传图片并压缩的实现方法
2015/12/22 PHP
PHP编程 SSO详细介绍及简单实例
2017/01/13 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
2018/05/21 PHP
PHP XML Expat解析器知识点总结
2019/02/15 PHP
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
如何将JS的变量值传递给ASP变量
2012/12/10 Javascript
Node.js中require的工作原理浅析
2014/06/24 Javascript
JS解析XML实例分析
2015/01/30 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
详解nodejs微信公众号开发——3.封装消息响应模块
2017/04/10 NodeJs
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
vue项目base64字符串转图片的实现代码
2018/07/13 Javascript
vue通过style或者class改变样式的实例代码
2018/10/30 Javascript
如何使用vuex实现兄弟组件通信
2018/11/02 Javascript
详解JS实现系统登录页的登录和验证
2019/04/29 Javascript
深入学习JavaScript 高阶函数
2019/06/11 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
iview实现图片上传功能
2020/06/29 Javascript
在vue中使用jsonp进行跨域请求接口操作
2020/10/29 Javascript
原生js实现自定义消息提示框
2020/11/19 Javascript
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python实现竖排打印传单手机号码易撕条
2015/03/16 Python
python实现批量改文件名称的方法
2015/05/25 Python
Python continue继续循环用法总结
2018/06/10 Python
Django中使用CORS实现跨域请求过程解析
2019/08/05 Python
英国最红的高街时尚品牌:Topshop
2016/08/05 全球购物
linux面试题参考答案(4)
2014/09/21 面试题
课程设计心得体会
2013/12/28 职场文书
应急管理培训方案
2014/06/12 职场文书
幼儿园大班区域活动总结
2014/07/09 职场文书
个人合伙协议书范本
2014/10/14 职场文书
golang判断key是否在map中的代码
2021/04/24 Golang
纯html+css实现Element loading效果
2021/08/02 HTML / CSS