Proyectos de Subversion Moodle

Rev

Autoría | Ultima modificación | Ver Log |

<?php
/*
pSplit - class to draw spline splitted charts

Version     : 2.1.4
Made by     : Jean-Damien POGOLOTTI
Last Update : 19/01/2014

This file can be distributed under the license you can find at :

http://www.pchart.net/license

You can find the whole class documentation on the pChart web site.
*/
define("TEXT_POS_TOP", 690001);
define("TEXT_POS_RIGHT", 690002);

/* pSplit class definition */
class pSplit
{
        var $pChartObject;
        
        /* Class creator */
        function __construct(){}

        /* Create the encoded string */
        function drawSplitPath($Object, $Values, array $Format = [])
        {
                $this->pChartObject = $Object;
                $Spacing = isset($Format["Spacing"]) ? $Format["Spacing"] : 20;
                $TextPadding = isset($Format["TextPadding"]) ? $Format["TextPadding"] : 2;
                $TextPos = isset($Format["TextPos"]) ? $Format["TextPos"] : TEXT_POS_TOP;
                $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
                $Force = isset($Format["Force"]) ? $Format["Force"] : 70;
                $Segments = isset($Format["Segments"]) ? $Format["Segments"] : 15;
                $FontSize = $Object->FontSize;
                $X1 = $Object->GraphAreaX1;
                $Y1 = $Object->GraphAreaY1;
                $X2 = $Object->GraphAreaX2;
                $Y2 = $Object->GraphAreaY2;
                /* Data Processing */
                $Data = $Values->getData();
                $Palette = $Values->getPalette();
                $LabelSerie = $Data["Abscissa"];
                $DataSerie = "";
                foreach($Data["Series"] as $SerieName => $Value) {
                        if ($SerieName != $LabelSerie && $DataSerie == "") {
                                $DataSerie = $SerieName;
                        }
                }

                $DataSerieSum = array_sum($Data["Series"][$DataSerie]["Data"]);
                $DataSerieCount = count($Data["Series"][$DataSerie]["Data"]);
                /* Scale Processing */
                if ($TextPos == TEXT_POS_RIGHT) {
                        $YScale = (($Y2 - $Y1) - (($DataSerieCount + 1) * $Spacing)) / $DataSerieSum;
                } else {
                        $YScale = (($Y2 - $Y1) - ($DataSerieCount * $Spacing)) / $DataSerieSum;
                }

                $LeftHeight = $DataSerieSum * $YScale;
                /* Re-compute graph width depending of the text mode choosen */
                if ($TextPos == TEXT_POS_RIGHT) {
                        $MaxWidth = 0;
                        foreach($Data["Series"][$LabelSerie]["Data"] as $Key => $Label) {
                                $Boundardies = $Object->getTextBox(0, 0, $Object->FontName, $Object->FontSize, 0, $Label);
                                if ($Boundardies[1]["X"] > $MaxWidth) {
                                        $MaxWidth = $Boundardies[1]["X"] + $TextPadding * 2;
                                }
                        }

                        $X2 = $X2 - $MaxWidth;
                }

                /* Drawing */
                $LeftY = ((($Y2 - $Y1) / 2) + $Y1) - ($LeftHeight / 2);
                $RightY = $Y1;
                $VectorX = (($X2 - $X1) / 2);
                
                foreach($Data["Series"][$DataSerie]["Data"] as $Key => $Value) {
                        
                        $Label = (isset($Data["Series"][$LabelSerie]["Data"][$Key])) ? $Data["Series"][$LabelSerie]["Data"][$Key] : "-";
                        
                        $LeftY1 = $LeftY;
                        $LeftY2 = $LeftY + $Value * $YScale;
                        $RightY1 = $RightY + $Spacing;
                        $RightY2 = $RightY + $Spacing + $Value * $YScale;;
                        $Settings = array(
                                "R" => $Palette[$Key]["R"],
                                "G" => $Palette[$Key]["G"],
                                "B" => $Palette[$Key]["B"],
                                "Alpha" => $Palette[$Key]["Alpha"],
                                "NoDraw" => TRUE,
                                "Segments" => $Segments,
                                "Surrounding" => $Surrounding
                        );
                        $PolyGon = [];
                        $Angle = $Object->getAngle($X2, $RightY1, $X1, $LeftY1);
                        $VectorX1 = cos(deg2rad($Angle + 90)) * $Force + ($X2 - $X1) / 2 + $X1;
                        $VectorY1 = sin(deg2rad($Angle + 90)) * $Force + ($RightY1 - $LeftY1) / 2 + $LeftY1;
                        $VectorX2 = cos(deg2rad($Angle - 90)) * $Force + ($X2 - $X1) / 2 + $X1;
                        $VectorY2 = sin(deg2rad($Angle - 90)) * $Force + ($RightY1 - $LeftY1) / 2 + $LeftY1;
                        $Points = $Object->drawBezier($X1, $LeftY1, $X2, $RightY1, $VectorX1, $VectorY1, $VectorX2, $VectorY2, $Settings);
                        foreach($Points as $Key => $Pos) {
                                $PolyGon[] = $Pos["X"];
                                $PolyGon[] = $Pos["Y"];
                        }

                        $Angle = $Object->getAngle($X2, $RightY2, $X1, $LeftY2);
                        $VectorX1 = cos(deg2rad($Angle + 90)) * $Force + ($X2 - $X1) / 2 + $X1;
                        $VectorY1 = sin(deg2rad($Angle + 90)) * $Force + ($RightY2 - $LeftY2) / 2 + $LeftY2;
                        $VectorX2 = cos(deg2rad($Angle - 90)) * $Force + ($X2 - $X1) / 2 + $X1;
                        $VectorY2 = sin(deg2rad($Angle - 90)) * $Force + ($RightY2 - $LeftY2) / 2 + $LeftY2;
                        $Points = $Object->drawBezier($X1, $LeftY2, $X2, $RightY2, $VectorX1, $VectorY1, $VectorX2, $VectorY2, $Settings);
                        $Points = array_reverse($Points);
                        foreach($Points as $Key => $Pos) {
                                $PolyGon[] = $Pos["X"];
                                $PolyGon[] = $Pos["Y"];
                        }

                        $Object->drawPolygon($PolyGon, $Settings);
                        if ($TextPos == TEXT_POS_RIGHT) {
                                $Object->drawText($X2 + $TextPadding, ($RightY2 - $RightY1) / 2 + $RightY1, $Label, ["Align" => TEXT_ALIGN_MIDDLELEFT]);
                        } else {
                                $Object->drawText($X2, $RightY1 - $TextPadding, $Label, ["Align" => TEXT_ALIGN_BOTTOMRIGHT]);
                        }

                        $LeftY = $LeftY2;
                        $RightY = $RightY2;
                }
        }
}

?>