graphing/class.3dbargraph.php
changeset 43 ce2e9caf2dfa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphing/class.3dbargraph.php	Sun Jan 04 16:40:36 2009 -0500
@@ -0,0 +1,243 @@
+<?php
+  require_once dirname(__FILE__) . "/class.graph.php";
+
+  class BarGraph extends CGraph {
+    var $bar_width = 32;
+    var $bar_height = 8;
+    var $bar_padding = 5;
+    var $bar_bordercolor = array(39, 78, 120);
+    var $bar_bgcolor = array(69, 129, 194);
+    var $bar_textfont = 2;
+
+    function BarGraph() {
+      $this->axis_deepness = $this->bar_height;
+      $this->graph_height = $this->graph_padding['top'] + $this->graph_areaheight + $this->graph_padding['bottom'];
+    }
+
+    /**
+     * Graph::SetBarBorderColor()
+     * Sets border color for bars
+     **/
+    function SetBarBorderColor($red, $green, $blue) {
+      $this->bar_bordercolor = array($red, $green, $blue);
+    }
+
+    /**
+     * Graph::SetBarBackgroundColor()
+     * Sets background color for bars
+     **/
+    function SetBarBackgroundColor($red, $green, $blue) {
+      $this->bar_bgcolor = array($red, $green, $blue);
+    }
+
+    /**
+     * Graph::SetBarDimensions()
+     * Sets with and height of each bar
+     **/
+    function SetBarDimensions($width, $height) {
+      if ($width > 0) $this->bar_width = $width;
+      if ($height >= 0) {
+        $this->bar_height = $height;
+        $this->axis_deepness = $height;
+      }
+    }
+
+    /**
+     * Graph::SetBarPadding()
+     * Sets padding (border) around each bar
+     **/
+    function SetBarPadding($padding) {
+      if ($padding > 0) $this->bar_padding = $padding;
+    }
+    function SetBarFont($font) {
+      $this->bar_textfont = 0;
+      switch ($font) {
+        case 'x-large': $this->bar_textfont++;
+        case 'large':   $this->bar_textfont++;
+        case 'medium':  $this->bar_textfont++;
+        case 'small':   $this->bar_textfont++;
+        case 'x-small': $this->bar_textfont++; break;
+        default:
+          $this->bar_textfont = $font;
+      }
+    }
+    function DrawGraph($file = "") {
+      $this->graph_width = $this->graph_padding['left'] +
+                           (count($this->data) * ($this->bar_width + ($this->bar_padding * 2))) +
+                           $this->graph_padding['right'];
+      $this->axis_deepness = $this->bar_height;
+
+      $this->im = imagecreatetruecolor($this->graph_width, $this->graph_height);
+
+      $this->axis_frontgridlines = 0;
+      $this->axis_xscalevisible = 0;
+      $this->axis_positions = array($this->axis_positions[0], 0, 0, 0);
+
+      CGraph::DrawGraph();
+      
+      if ($this->axis_minY > 0) $this->axis_minY = 0;
+      if ($this->axis_maxY < 0) $this->axis_maxY = 0;
+
+      $this->__Draw_LeftBottom_Axis();
+      
+      $p = 0;
+      foreach ($this->data as $name => $value) {
+        $p++;
+        $this->__DrawBarText($p, $name);
+        $this->__DrawBar($p, $value);
+      }
+      
+      $this->__Draw_TopRight_Axis();
+
+      CGraph::DrawGraph2();
+
+      if (strlen($file)) {
+        $ret = imagepng($this->im, $file);
+      } else {
+        header("Content-Type: image/png"); // thanks to Marcin G. :)
+        imagepng($this->im);
+        $ret = true;
+      }
+      imagedestroy($this->im);
+      return $ret;
+    }
+
+    /**
+     * Graph::__DrawBarText()
+     * Determines top and left to draw text to a choosen bar
+     **/
+    function __DrawBarText($bar, $text) {
+      $this->__DrawText($text,
+                        $this->graph_padding['left'] + (($this->bar_width + ($this->bar_padding * 2)) * ($bar - 0.5)),
+                        $this->graph_height - $this->graph_padding['bottom'] + 1,
+                        $this->im_axis_scalecolor,
+                        $this->bar_textfont,
+                        1);
+    }
+
+    /**
+     * Graph::__DrawBar()
+     * Draws a choosen bar with it's value
+     **/
+    function __DrawBar($bar, $value) {
+      $x = $this->graph_padding['left'] +
+           (($this->bar_width + ($this->bar_padding * 2)) * ($bar - 1)) +
+           $this->bar_padding;
+      $y = $this->graph_areaheight / ($this->axis_maxY - $this->axis_minY);
+      if ($value >= 0) {
+        $this->____DrawBar($x,
+                           $this->graph_height - $this->graph_padding['bottom'] - abs(floor($this->axis_minY * $y)) - floor($y * $value),
+                           $x + $this->bar_width,
+                           $this->graph_height - $this->graph_padding['bottom'] - abs(floor($this->axis_minY * $y)));
+      } else {
+        $this->____DrawBar($x,
+                           $this->graph_height - $this->graph_padding['bottom'] - abs(floor($this->axis_minY * $y)),
+                           $x + $this->bar_width,
+                           $this->graph_height - $this->graph_padding['bottom'] - floor($this->axis_minY * -$y) + floor($y * -$value));
+      }
+    }
+    
+    /**
+     * Graph::____DrawBar()
+     * Draws the actual rectangles that form a bar
+     **/
+    function ____DrawBar($x1, $y1, $x2, $y2) {
+      $this->__AllocateColor("im_bar_bordercolor",
+                             $this->bar_bordercolor,
+                             ( $this->graph_transparencylevel * 1.5));
+      $this->__AllocateColor("im_bar_bgcolor",
+                             $this->bar_bgcolor,
+                             ( $this->graph_transparencylevel * 1.5));
+                             
+      // base square
+      $this->__DrawPolygon(array($x1, $y2, $x2, $y2, $x2 + $this->bar_height,
+                                 $y2 - $this->bar_height, $x1 + $this->bar_height,
+                                 $y2 - $this->bar_height),
+                           $this->im_bar_bgcolor,
+                           true);
+      $this->__DrawPolygon(array($x1, $y2, $x2, $y2, $x2 + $this->bar_height,
+                                 $y2 - $this->bar_height, $x1 + $this->bar_height,
+                                 $y2 - $this->bar_height),
+                           $this->im_bar_bordercolor);
+
+      // back square
+      $this->__DrawPolygon(array($x1 + $this->bar_height, $y1 - $this->bar_height,
+                                 $x2 + $this->bar_height, $y1 - $this->bar_height,
+                                 $x2 + $this->bar_height, $y2 - $this->bar_height,
+                                 $x1 + $this->bar_height, $y2 - $this->bar_height),
+                           $this->im_bar_bgcolor,
+                           true);
+      $this->__DrawPolygon(array($x1 + $this->bar_height, $y1 - $this->bar_height,
+                                 $x2 + $this->bar_height, $y1 - $this->bar_height,
+                                 $x2 + $this->bar_height, $y2 - $this->bar_height,
+                                 $x1 + $this->bar_height, $y2 - $this->bar_height),
+                           $this->im_bar_bordercolor);
+
+      // left square
+      $this->__DrawPolygon(array($x1, $y1, $x1 + $this->bar_height, $y1 - $this->bar_height,
+                                 $x1 + $this->bar_height, $y2 - $this->bar_height,
+                                 $x1, $y2),
+                           $this->im_bar_bgcolor,
+                           true);
+      $this->__DrawPolygon(array($x1, $y1, $x2, $y1, $x2, $y2, $x1, $y2),
+                           $this->im_bar_bordercolor);
+
+      // front square
+      $this->__DrawPolygon(array($x1, $y1, $x2, $y1, $x2, $y2, $x1, $y2),
+                           $this->im_bar_bgcolor,
+                           true);
+      $this->__DrawPolygon(array($x1, $y1, $x2, $y1, $x2, $y2, $x1, $y2),
+                           $this->im_bar_bordercolor);
+                           
+      // right square
+      $this->__DrawPolygon(array($x2, $y2, $x2, $y1, $x2 + $this->bar_height,
+                                 $y1 - $this->bar_height, $x2 + $this->bar_height,
+                                 $y2 - $this->bar_height),
+                           $this->im_bar_bgcolor,
+                           true);
+      $this->__DrawPolygon(array($x2, $y2, $x2, $y1, $x2 + $this->bar_height,
+                                 $y1 - $this->bar_height, $x2 + $this->bar_height,
+                                 $y2 - $this->bar_height),
+                           $this->im_bar_bordercolor);
+
+      // top square
+      $this->__DrawPolygon(array($x1, $y1, $x2, $y1, $x2 + $this->bar_height,
+                                 $y1 - $this->bar_height, $x1 + $this->bar_height,
+                                 $y1 - $this->bar_height),
+                           $this->im_bar_bgcolor,
+                           true);
+      $this->__DrawPolygon(array($x1, $y1, $x2, $y1, $x2 + $this->bar_height,
+                                 $y1 - $this->bar_height, $x1 + $this->bar_height,
+                                 $y1 - $this->bar_height),
+                           $this->im_bar_bordercolor);
+    }
+    
+    /**
+     * Graph::__Load3dbarValues()
+     * Loads definitions to 3d bar settings
+     **/
+    function __Load3dbarValues($data) {
+      foreach ($data as $name => $value) {
+        $name = strtolower($name);
+        switch ($name) {
+          case 'background-color':
+            $this->__SetColorToValue("bar_bgcolor", $value);
+            break;
+          case 'border-color':
+            $this->__SetColorToValue("bar_bordercolor", $value);
+            break;
+          case 'padding':
+            $this->bar_padding = $value;
+            break;
+          case 'width':
+            $this->bar_width = (int) $value;
+            break;
+          case 'height':
+            $this->bar_height = (int) $value;
+            $this->axis_deepness = (int) $value;
+            break;
+        }
+      }
+    }
+  }
+?>