You are here

class pSplit in Visitors 7.2

Same name and namespace in other branches
  1. 7 pChart/class/pSplit.class.php \pSplit

Hierarchy

Expanded class hierarchy of pSplit

File

pChart/class/pSplit.class.php, line 20

View source
class pSplit {
  var $pChartObject;

  /* Class creator */
  function pSplit() {
  }

  /* Create the encoded string */
  function drawSplitPath($Object, $Values, $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) {
      if (isset($Data["Series"][$LabelSerie]["Data"][$Key])) {
        $Label = $Data["Series"][$LabelSerie]["Data"][$Key];
      }
      else {
        $Label = "-";
      }
      $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, array(
          "Align" => TEXT_ALIGN_MIDDLELEFT,
        ));
      }
      else {
        $Object
          ->drawText($X2, $RightY1 - $TextPadding, $Label, array(
          "Align" => TEXT_ALIGN_BOTTOMRIGHT,
        ));
      }
      $LeftY = $LeftY2;
      $RightY = $RightY2;
    }
  }

}

Members