You are here

function pSplit::drawSplitPath in Visitors 7.2

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

File

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

Class

pSplit

Code

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;
  }
}