<? function piechart($title, $slice, $itemName, $fsizes=0) { function matchset($xx) { $arrx = array_values($xx); $i = 0; while (list ($key, $val) = each ($arrx)) { $xy[$i] = $val; $i++; } $cnt = $i; return $xy; } $sliced = matchset($slice); $countqw = count($sliced); $ItemNames = matchset($itemName); // initialize some variables $sum = 0; $degrees = Array(); $diameter = 250; $radius = $diameter/2; // calculate sum of slices for ($x=0; $x<$countqw ; $x++) { $sum += $sliced[$x]; } // convert each slice into corresponding percentage of 360-degree circle $degCount = 0; for ($y=0; $y<$countqw; $y++) { if((($sliced[$y]/$sum) * 360) > '0') { $degrees[$degCount] = ($sliced[$y]/$sum) * 360; $degCount++; } } // set up image and colours Header("Content-Type: image/png"); $im = ImageCreate(550, 300); $black = ImageColorAllocateAlpha($im, 0, 0, 0, 0); $white = ImageColorAllocateAlpha($im, 255, 255, 255, 127); $hexCode = array("255,153,0","0,204,153","204,255,102","255,102,102","102,204,255","204,153,255","255,0,0","51,0,255","255,51,153","204,0,255","255,255,51","51,255,51","255,102,0"); // fill image with white ImageFill($im, 0, 0, $white); // draw baseline ImageLine($im, 150,150, 225, 150, $black); for ($z=0; $z<$countqw; $z++) { // calculate and draw arc corresponding to each slice ImageArc($im, 150, 150, $diameter, $diameter, $last_angle, ($last_angle+$degrees[$z]), $black); $last_angle = $last_angle+$degrees[$z]; // calculate coordinate of end-point of each arc by obtaining // length of segment and adding radius // remember that cos() and sin() return value in radians // and have to be converted back to degrees! $end_x = round(150 + ($radius * cos($last_angle*pi()/180))); $end_y = round(150 + ($radius * sin($last_angle*pi()/180))); // demarcate slice with another line ImageLine($im, 150, 150, $end_x, $end_y, $black); } // this section is meant to calculate the mid-point of each slice // so that it can be filled with colour // initialize some variables $prev_angle = 0; $pointer = 0; for ($z=0; $z<$countqw; $z++) { // to calculate mid-point of a slice, the procedure is to use an angle //bisector // and then obtain the mid-point of that bisector $pointer = $prev_angle + $degrees[$z]; $this_angle = ($prev_angle + $pointer) / 2; $prev_angle = $pointer; // get end-point of angle bisector $end_x = round(150 + ($radius * cos($this_angle*pi()/180))); $end_y = round(150 + ($radius * sin($this_angle*pi()/180))); // given start point (150,150) and end-point above, mid-point can be // calculated with standard mid-point formula $mid_x = round((150+($end_x))/2); $mid_y = round((150+($end_y))/2); // depending on which slice, fill with appropriate colour $hexCodeSplit = explode(',',$hexCode[$z]); $WedgeColor = ImageColorAllocate($im, $hexCodeSplit[0],$hexCodeSplit[1],$hexCodeSplit[2]); ImageFillToBorder($im, $mid_x, $mid_y, $black, $WedgeColor); } // write string ImageString($im,5, 250, 10, "$title", $black); $red = ImageColorAllocate($im, 255, 153, 153); $blue = ImageColorAllocate($im, 0, 0, 255); // Create Color key and slice description $adjPosition = 40; for ($z=0; $z<$degCount; $z++) { $percent = ($degrees[$z]/360)*100; $percent = round($percent,2); $adjPosition = $adjPosition + 15; $hexCodeSplit = explode(',',$hexCode[$z]); $percentLen = strlen($percent); if($percentLen == '4'){$percent = " "."$percent";} if($percentLen == '3'){$percent = " "."$percent";} if($percentLen == '2'){$percent = " "."$percent";} if($percentLen == '1'){$percent = " "."$percent";} ImageString($im,2, 300, ($adjPosition+1), "$percent%", $black); $WedgeColor = ImageColorAllocate($im, $hexCodeSplit[0],$hexCodeSplit[1],$hexCodeSplit[2]); ImageFilledRectangle($im, 340, $adjPosition, 350, ($adjPosition+10), $black); ImageFilledRectangle($im, 341, ($adjPosition+1), 349, ($adjPosition+9), $WedgeColor); if($fsizes){ if($sliced[$z] >= "1000" && $sliced[$z] < "1000000") { $sliced[$z] = $sliced[$z]/1000; $sliced[$z] = sprintf("%01.2f", "$sliced[$z]")."G"; } else $sliced[$z] = "$sliced[$z]"."M"; } $sliceLen = strlen($sliced[$z]); if($sliceLen == '5'){$sliced[$z] = " "."$sliced[$z]";} if($sliceLen == '4'){$sliced[$z] = " "."$sliced[$z]";} if($sliceLen == '3'){$sliced[$z] = " "."$sliced[$z]";} if($sliceLen == '2'){$sliced[$z] = " "."$sliced[$z]";} if($sliceLen == '1'){$sliced[$z] = " "."$sliced[$z]";} ImageString($im,2, 360, ($adjPosition+1), "$sliced[$z]", $black); ImageString($im,2, 410, ($adjPosition+1), "$ItemNames[$z]", $black); } // output to browser ImagePNG($im); } ?>