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 相关文章推荐
超级简单的发送邮件程序
Oct 09 PHP
PHP 全角转半角实现代码
May 16 PHP
解析php中的escape函数
Jun 29 PHP
php读取csv实现csv文件下载功能
Dec 18 PHP
PHP中数组的分组排序实例
Jun 01 PHP
PHP版微信公众平台红包API
Apr 02 PHP
PHP会话控制实例分析
Dec 24 PHP
php实现单笔转账到支付宝功能
Oct 09 PHP
PHP智能识别收货地址信息实例
Jan 05 PHP
Yii框架引入coreseek分页功能示例
Feb 08 PHP
Laravel5.4简单实现app接口Api Token认证方法
Aug 29 PHP
laravel 实现登陆后返回登陆前的页面方法
Oct 03 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
一个程序下载的管理程序(一)
2006/10/09 PHP
php使用curl抓取qq空间的访客信息示例
2014/02/28 PHP
php cli换行示例
2014/04/22 PHP
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
简单的代码实现jquery定时器
2014/01/03 Javascript
超链接的禁用属性Disabled使用示例
2014/07/31 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
2014/11/28 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
基于原生js淡入淡出函数封装(兼容IE)
2016/10/20 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
Vue2.x中的父子组件相互通信的实现方法
2017/05/02 Javascript
Vue.js如何实现路由懒加载浅析
2017/08/14 Javascript
JavaScript实现微信红包算法及问题解决方法
2018/04/26 Javascript
基于Vue2x的图片预览插件的示例代码
2018/05/14 Javascript
图文讲解vue的v-if使用方法
2019/02/11 Javascript
解决element ui select下拉框不回显数据问题的解决
2019/02/20 Javascript
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
微信小程序select下拉框实现源码
2019/11/08 Javascript
javascript 原型与原型链的理解及应用实例分析
2020/02/10 Javascript
vue.config.js中配置Vue的路径别名的方法
2020/02/11 Javascript
JS面向对象编程实现的拖拽功能案例详解
2020/03/03 Javascript
JS中间件设计模式的深入探讨与实例分析
2020/04/11 Javascript
Python构建XML树结构的方法示例
2017/06/30 Python
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
python批量设置多个Excel文件页眉页脚的脚本
2018/03/14 Python
python+pyqt5编写md5生成器
2019/03/18 Python
python中的列表与元组的使用
2019/08/08 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
承认错误的检讨书
2014/01/30 职场文书
2014年十一国庆向国旗敬礼寄语
2014/04/11 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
感恩老师主题班会
2015/08/12 职场文书
小学教师师德培训心得体会
2016/01/09 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书
看完这篇文章获得一些java if优化技巧
2021/07/15 Java/Android