<?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();
?>
|