zoukankan      html  css  js  c++  java
  • 超酷PHP饼图

    <?
    //+------------------------+
    //| pie3dfun.php//公用函数 |
    //+------------------------+

    define("ANGLE_STEP", 5);    //定义画椭圆弧时的角度步长

    function draw_getdarkcolor($img,$clr)    //求$clr对应的暗色
    {
        
    $rgb    =    imagecolorsforindex($img,$clr);
        return array(
    $rgb["red"]/2,$rgb["green"]/2,$rgb["blue"]/2);
    }

    function
    draw_getexy($a, $b, $d)    //求角度$d对应的椭圆上的点坐标
    {
        
    $d        =    deg2rad($d);
        return array(
    round($a*Cos($d)), round($b*Sin($d)));
    }

    function
    draw_arc($img,$ox,$oy,$a,$b,$sd,$ed,$clr)    //椭圆弧函数
    {
        
    $n                    =    ceil(($ed-$sd)/ANGLE_STEP);
        
    $d                    =    $sd;
        list(
    $x0,$y0)        =    draw_getexy($a,$b,$d);
        for(
    $i=0; $i<$n; $i++)
        {
            
    $d                =    ($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP);
            list(
    $x, $y)    =    draw_getexy($a, $b, $d);
            
    imageline($img, $x0+$ox, $y0+$oy, $x+$ox, $y+$oy, $clr);
            
    $x0                =    $x;
            
    $y0                =    $y;
        }
    }

    function
    draw_sector($img, $ox, $oy, $a, $b, $sd, $ed, $clr)    //画扇面
    {
        
    $n                    =    ceil(($ed-$sd)/ANGLE_STEP);
        
    $d                    =    $sd;
        list(
    $x0,$y0)        =    draw_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)    =    draw_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)        =    draw_getexy($a/2, $b/2, ($d+$sd)/2);
        
    imagefill($img, $x+$ox, $y+$oy, $clr);
    }

    function
    draw_sector3d($img, $ox, $oy, $a, $b, $v, $sd, $ed, $clr)    //3d扇面
    {
        
    draw_sector($img, $ox, $oy, $a, $b, $sd, $ed, $clr);
        if(
    $sd<180)
        {
            list(
    $R, $G, $B)    =    draw_getdarkcolor($img, $clr);
            
    $clr=imagecolorallocate($img, $R, $G, $B);
            if(
    $ed>180) $ed        =    180;
            list(
    $sx, $sy)        =    draw_getexy($a,$b,$sd);
            
    $sx                    +=    $ox;
            
    $sy                    +=    $oy;
            list(
    $ex, $ey)        =    draw_getexy($a, $b, $ed);
            
    $ex                    +=    $ox;
            
    $ey                    +=    $oy;
            
    imageline($img, $sx, $sy, $sx, $sy+$v, $clr);
            
    imageline($img, $ex, $ey, $ex, $ey+$v, $clr);
            
    draw_arc($img, $ox, $oy+$v, $a, $b, $sd, $ed, $clr);
            list(
    $sx, $sy)        =    draw_getexy($a, $b, ($sd+$ed)/2);
            
    $sy                    +=    $oy+$v/2;
            
    $sx                    +=    $ox;
            
    imagefill($img, $sx, $sy, $clr);
        }
    }

    function
    draw_getindexcolor($img, $clr)    //RBG转索引色
    {
        
    $R        =    ($clr>>16) & 0xff;
        
    $G        =    ($clr>>8)& 0xff;
        
    $B        =    ($clr) & 0xff;
        return
    imagecolorallocate($img, $R, $G, $B);
    }

    // 绘图主函数,并输出图片
    // $datLst 为数据数组, $datLst 为标签数组, $datLst 为颜色数组
    // 以上三个数组的维数应该相等
    function draw_img($datLst,$labLst,$clrLst,$a=250,$b=120,$v=20,$font=10)
    {
        
    $ox        =    5+$a;
        
    $oy        =    5+$b;
        
    $fw        =    imagefontwidth($font);
        
    $fh        =    imagefontheight($font);

        
    $n        =    count($datLst);//数据项个数

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

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

        
    //转RGB为索引色
        
    for($i=0; $i<$n; $i++)
            
    $clrLst[$i]    =    draw_getindexcolor($img,$clrLst[$i]);

        
    $clrbk    =    imagecolorallocate($img, 0xff, 0xff, 0xff);
        
    $clrt    =    imagecolorallocate($img, 0x00, 0x00, 0x00);

        
    //填充背景色
        
    imagefill($img, 0, 0, $clrbk);

        
    //求和
        
    $tot    =    0;
        for(
    $i=0; $i<$n; $i++)
            
    $tot    +=    $datLst[$i];

        
    $sd        =    0;
        
    $ed        =    0;
        
    $ly        =    10+$b*2+$v;
        for(
    $i=0; $i<$n; $i++)
        {
            
    $sd    =    $ed;
            
    $ed    +=    $datLst[$i]/$tot*360;

            
    //画圆饼
            
    draw_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);

            
    $str    =    iconv("GB2312", "UTF-8", $labLst[$i]);
            
    ImageTTFText($img, $font, 0, 5+2*$fw, $ly+13, $clrt, "./simsun.ttf", $str.":".$datLst[$i]."(".(round(10000*($datLst[$i]/$tot))/100)."%)");
            
    $ly        +=    $fh+2;
        }

        
    //输出图形
        
    header("Content-type: image/png");

        
    //输出生成的图片
        
    $imgFileName = "../temp/".time().".png";
        
    imagepng($img,$imgFileName);
        echo
    '<IMG SRC="'.$imgFileName.'" BORDER="1" ALT="统计饼图">';
    }

    $datLst    =    array(30, 10, 20, 20, 10, 20, 10, 20);    //数据
    $labLst    =    array("中国科技大学", "安徽理工大学", "清华大学", "北京大学", "南京大学", "上海大学", "河海大学", "中山大学");    //标签
    $clrLst    =    array(0x99ff00, 0xff6666, 0x0099ff, 0xff99ff, 0xffff99, 0x99ffff, 0xff3333, 0x009999);

    //画图
    draw_img($datLst,$labLst,$clrLst);
    ?>

    效果图如下:

    统计饼图
  • 相关阅读:
    Java动态代理详解
    (10) openssl dhparam(密钥交换)
    (9) openssl enc(对称加密)
    (8) openssl rsautl(签名/验证签名/加解密文件)和openssl pkeyutl(文件的非对称加密)
    (7) openssl dgst(生成和验证数字签名)
    (6) openssl passwd(生成加密的密码)
    (5) openssl speed(测试算法性能)和openssl rand(生成随机数)
    (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
    (3) openssl genrsa(生成rsa私钥)
    (2) OpenSSL命令
  • 原文地址:https://www.cnblogs.com/longware/p/13382472.html
Copyright © 2011-2022 走看看