/** * This function draw a pseudo-3D pie chart * @param pData * @param int X-Position of the Center * @param int Y-Position of the Center * @param int Radius of the cake * @param const int Draw the Labels to the pies? PIE_LABELS, PIE_NOLABEL, PIE_PERCENTAGE, PIE_PERCENATGE_LABEL * @param bool Enhance colors? * @param int Skew * @param int Height of the splices * @param int Distance between the splices * @param int number of decimals * @param ShadowProperties * @access public */ public function drawPieGraph(pData $data, $XPos, $YPos, $Radius = 100, $DrawLabels = PIE_NOLABEL, $EnhanceColors = TRUE, $Skew = 60, $SpliceHeight = 20, $SpliceDistance = 0, $Decimals = 0, ShadowProperties $shadowProperties = null) { if ($shadowProperties == null) { $shadowProperties = ShadowProperties::FromDefaults(); } /* Validate the Data and DataDescription array */ $this->validateDataDescription("drawPieGraph", $data->getDataDescription(), FALSE); $this->validateData("drawPieGraph", $data->getData()); /* Determine pie sum */ $Series = 0; $PieSum = 0; $rPieSum = 0; foreach ($data->getDataDescription()->values as $ColName) { if ($ColName != $data->getDataDescription()->getPosition()) { $Series++; $dataArray = $data->getData(); foreach (array_keys($dataArray) as $Key) { if (isset($dataArray[$Key][$ColName])) { if ($dataArray[$Key][$ColName] == 0) { $iValues[] = 0; $rValues[] = 0; $iLabels[] = $dataArray[$Key][$data->getDataDescription()->getPosition()]; } else { $PieSum += $dataArray[$Key][$ColName]; $iValues[] = $dataArray[$Key][$ColName]; $iLabels[] = $dataArray[$Key][$data->getDataDescription()->getPosition()]; $rValues[] = $dataArray[$Key][$ColName]; $rPieSum += $dataArray[$Key][$ColName]; } } } } } /* Validate serie */ if ($Series != 1) { throw new Exception("Pie chart can only accept one serie of data."); } /** @todo Proper exception type needed here */ $SpliceDistanceRatio = $SpliceDistance; $SkewHeight = $Radius * $Skew / 100; $SpliceRatio = (360 - $SpliceDistanceRatio * count($iValues)) / $PieSum; $SplicePercent = 100 / $PieSum; $rSplicePercent = 100 / $rPieSum; /* Calculate all polygons */ $Angle = 0; $CDev = 5; $TopPlots = ""; $BotPlots = ""; $aTopPlots = ""; $aBotPlots = ""; foreach ($iValues as $Key => $Value) { $XCenterPos = cos(($Angle - $CDev + ($Value * $SpliceRatio + $SpliceDistanceRatio) / 2) * M_PI / 180) * $SpliceDistance + $XPos; $YCenterPos = sin(($Angle - $CDev + ($Value * $SpliceRatio + $SpliceDistanceRatio) / 2) * M_PI / 180) * $SpliceDistance + $YPos; $XCenterPos2 = cos(($Angle + $CDev + ($Value * $SpliceRatio + $SpliceDistanceRatio) / 2) * M_PI / 180) * $SpliceDistance + $XPos; $YCenterPos2 = sin(($Angle + $CDev + ($Value * $SpliceRatio + $SpliceDistanceRatio) / 2) * M_PI / 180) * $SpliceDistance + $YPos; $TopPlots[$Key][] = round($XCenterPos); $BotPlots[$Key][] = round($XCenterPos); $TopPlots[$Key][] = round($YCenterPos); $BotPlots[$Key][] = round($YCenterPos + $SpliceHeight); $aTopPlots[$Key][] = $XCenterPos; $aBotPlots[$Key][] = $XCenterPos; $aTopPlots[$Key][] = $YCenterPos; $aBotPlots[$Key][] = $YCenterPos + $SpliceHeight; /* Process labels position & size */ $Caption = ""; if (!($DrawLabels == PIE_NOLABEL)) { $TAngle = $Angle + $Value * $SpliceRatio / 2; if ($DrawLabels == PIE_PERCENTAGE) { $Caption = round($rValues[$Key] * pow(10, $Decimals) * $rSplicePercent) / pow(10, $Decimals) . "%"; } elseif ($DrawLabels == PIE_LABELS) { $Caption = $iLabels[$Key]; } elseif ($DrawLabels == PIE_PERCENTAGE_LABEL) { $Caption = $iLabels[$Key] . "\r\n" . round($Value * pow(10, $Decimals) * $SplicePercent) / pow(10, $Decimals) . "%"; } $Position = imageftbbox($this->FontSize, 0, $this->FontName, $Caption); $TextWidth = $Position[2] - $Position[0]; $TextHeight = abs($Position[1]) + abs($Position[3]); $TX = cos($TAngle * M_PI / 180) * ($Radius + 10) + $XPos; if ($TAngle > 0 && $TAngle < 180) { $TY = sin($TAngle * M_PI / 180) * ($SkewHeight + 10) + $YPos + $SpliceHeight + 4; } else { $TY = sin($TAngle * M_PI / 180) * ($SkewHeight + 4) + $YPos - $TextHeight / 2; } if ($TAngle > 90 && $TAngle < 270) { $TX = $TX - $TextWidth; } $this->canvas->drawText($this->FontSize, 0, new Point($TX, $TY), new Color(70, 70, 70), $this->FontName, $Caption, $shadowProperties); } /* Process pie slices */ for ($iAngle = $Angle; $iAngle <= $Angle + $Value * $SpliceRatio; $iAngle = $iAngle + 0.5) { $TopX = cos($iAngle * M_PI / 180) * $Radius + $XPos; $TopY = sin($iAngle * M_PI / 180) * $SkewHeight + $YPos; $TopPlots[$Key][] = round($TopX); $BotPlots[$Key][] = round($TopX); $TopPlots[$Key][] = round($TopY); $BotPlots[$Key][] = round($TopY + $SpliceHeight); $aTopPlots[$Key][] = $TopX; $aBotPlots[$Key][] = $TopX; $aTopPlots[$Key][] = $TopY; $aBotPlots[$Key][] = $TopY + $SpliceHeight; } $TopPlots[$Key][] = round($XCenterPos2); $BotPlots[$Key][] = round($XCenterPos2); $TopPlots[$Key][] = round($YCenterPos2); $BotPlots[$Key][] = round($YCenterPos2 + $SpliceHeight); $aTopPlots[$Key][] = $XCenterPos2; $aBotPlots[$Key][] = $XCenterPos2; $aTopPlots[$Key][] = $YCenterPos2; $aBotPlots[$Key][] = $YCenterPos2 + $SpliceHeight; $Angle = $iAngle + $SpliceDistanceRatio; } $this->drawPieGraphBottomPolygons($iValues, $BotPlots, $EnhanceColors, $aBotPlots, $shadowProperties); $this->drawPieGraphLayers($iValues, $TopPlots, $EnhanceColors, $SpliceHeight, $this->palette, $shadowProperties); $this->drawPieGraphTopPolygons($iValues, $TopPlots, $EnhanceColors, $aTopPlots, $shadowProperties); }
/** * Remove shadow option */ function clearShadow() { $this->shadowProperties = ShadowProperties::FromDefaults(); }