<?php
 
/**
 
 * @author Dodit Suprianto
 
 * Email: d0dit@yahoo.com
 
 * Website: http://www.meozit.com, http://doditsuprianto.com
 
 * 
 
 * File name: pieChart.class.php
 
 * 
 
 * Description: 
 
 * Custom pie chart is a class to generate your own pie chart. Easy to use and very simple. 
 
 * You don't need to configure very much. Just set a canvas area, set a value and description for an each pie slice, 
 
 * of course you should add other slices as you like. This pie chart will calculate and generate automatically for you. 
 
 * If need it you can also change the font style, color background and font color. 
 
 * This pie chart could be bind with your data for present a static data such as vooting, data visitor, and other purpose.
 
 * 
 
 */
 
 
class pieChart
 
{
 
    private $canvasWidth;
 
    private $canvasHeight;
 
    private $tickness;
 
    private $color = array();
 
    private $image;
 
    private $degree = array();
 
    private $value = array();
 
    private $description = array();
 
    private $font;
 
    private $fontcolor;
 
    private $bgcolor;
 
    private $bgR;
 
    private $bgG;
 
    private $bgB;
 
    private $fontR;
 
    private $fontG;
 
    private $fontB;
 
    private $title = array();
 
        
 
    public function __construct($canvasWidth, $canvasHeight, $tickness)
 
    {
 
        $this->canvasWidth = $canvasWidth;
 
        $this->canvasHeight = $canvasHeight;
 
        $this->image = imagecreatetruecolor($this->canvasWidth, $this->canvasHeight);        
 
        $this->tickness = $tickness;    
 
    }
 
    
 
    public function setTitle($title)
 
    {
 
        $this->title[] = $title;    
 
    }
 
    
 
    public function setFontColor($fontcolor)
 
    {
 
        if ($fontcolor)
 
        {
 
            $this->fontcolor = imagecolorallocate($this->image, hexdec(substr(trim($fontcolor),1,2)), hexdec(substr(trim($fontcolor),3,2)), hexdec(substr(trim($fontcolor),5,2)));
 
        } else {$this->fontcolor = imagecolorallocate($this->image, 0, 0, 0);}
 
    }
 
    
 
    public function setBGColor($bgcolor)
 
    {
 
        if ($bgcolor)
 
        {
 
            $this->bgR = hexdec(substr(trim($bgcolor), 1, 2));
 
            $this->bgG = hexdec(substr(trim($bgcolor), 3, 2));
 
            $this->bgB = hexdec(substr(trim($bgcolor), 5, 2));
 
            $this->bgcolor = imagecolorallocate($this->image, hexdec(substr(trim($bgcolor),1,2)), hexdec(substr(trim($bgcolor),3,2)), hexdec(substr(trim($bgcolor),5,2)));
 
        } else {$this->bgcolor = imagecolorallocate($this->image, 0, 0, 0);}
 
    }
 
    
 
    public function setFont($font)
 
    {
 
        $this->font = $font;
 
    }
 
    
 
    public function Tickness($tickness)
 
    {
 
        $this->tickness = $tickness;
 
    }
 
    
 
    private function pieSlice()
 
    {
 
        $total = 0;
 
        for ($i=0; $i < count($this->value); $i++)
 
        {
 
            $total += $this->value[$i];
 
        }
 
        
 
        for ($i=0; $i < count($this->value); $i++)
 
        {
 
            $this->degree[$i] = $this->value[$i] / $total * 360;
 
            $R = mt_rand(25,250);
 
            $G = mt_rand(25,250);
 
            $B = mt_rand(25,250);
 
            $this->color["light"][$i] = imagecolorallocate($this->image, $R, $G, $B);
 
            $this->color["dark"][$i] = imagecolorallocate($this->image, $R - 20, $G - 20, $B - 20);
 
        }
 
    }
 
    
 
    public function setValue($description, $value)
 
    {
 
        $this->value[] = $value;
 
        $this->description[] = $description;
 
    }
 
    
 
    public function showPie()
 
    {
 
        imagefill($this->image, 0, 0, imagecolorallocate($this->image, $this->bgR, $this->bgG, $this->bgB));
 
        
 
        $pieX = ceil($this->canvasWidth / 2);
 
        $pieY = ceil($this->canvasHeight / 2) - 60;
 
        
 
        $this->pieSlice();        
 
            
 
        for ($i = $this->tickness + $pieY; $i > $pieY; $i--) 
 
        {
 
            $start = 0;
 
            for ($iterate=0; $iterate < count($this->value); $iterate++)
 
            {
 
                imagefilledarc($this->image, $pieX, $i, $this->canvasWidth - 50, ($this->canvasWidth - 50)/2, $start, $start + $this->degree[$iterate], $this->color["dark"][$iterate], IMG_ARC_PIE);
 
                  $start += $this->degree[$iterate];
 
            }
 
        }
 
    
 
        $start = 0;
 
        $x1 = 20;
 
        $y1 = 0 + $this->canvasHeight * 2 / 3;
 
        $x2 = 30;
 
        $y2 = 10 + $this->canvasHeight * 2 / 3;
 
        
 
        for ($iterate=0; $iterate < count($this->value); $iterate++)
 
        {
 
            imagefilledarc($this->image, $pieX, $pieY, $this->canvasWidth - 50, ($this->canvasWidth - 50)/2, $start, $start + $this->degree[$iterate], $this->color["light"][$iterate], IMG_ARC_PIE);            
 
            imagefilledrectangle($this->image, $x1, $y1, $x2, $y2, $this->color["light"][$iterate]);
 
            imagettftext($this->image, 9, 0, $x2 + 5, $y2, $this->fontcolor, $this->font, $this->description[$iterate] . " = " . $this->value[$iterate]);
 
            $start += $this->degree[$iterate];            
 
            $y1 += 15;
 
            $y2 += 15;
 
        }
 
        
 
        $py = 30;
 
        for ($i=0; $i<count($this->title); $i++)
 
        {
 
            $textbox = imagettfbbox(12, 0, $this->font, $this->title[$i]);
 
            $px = ($this->canvasWidth - $textbox[4])/2;
 
            $py = 30 + $i * 30;
 
        
 
            imagettftext($this->image, 12, 0, $px, $py, $this->fontcolor, $this->font, $this->title[$i]);
 
        }
 
 
        header('Content-type: image/png');
 
        imagepng($this->image);        
 
    }
 
    
 
    public function __destruct()
 
    {
 
        imagedestroy($this->image);
 
    }
 
}
 
 
$img = new pieChart(300, 430, 26);
 
$img->setFont("lsans.ttf");
 
$img->setValue("http://www.doditsuprianto.com", 56);
 
$img->setValue("http://www.meozit.com", 100);
 
$img->setValue("http://www.goiklan.com", 78);
 
$img->setValue("http://www.phpclasses.org", 190);
 
$img->setValue("http://www.hotscripts.com",120);
 
$img->setValue("http://www.google.com", 45);
 
$img->setBGColor("#001122");
 
$img->setFontColor("#FFFFFF");
 
$img->setTitle("FIRST TITLE ON THE FIRST LINE");
 
$img->setTitle("SECOND TITLE ON THE SECOND LINE");
 
$img->showPie();
 
?>
 
 |