[ Index ]
 

Code source de vtiger CRM 5.0.2

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/Image/Graph/ -> Tool.php (source)

   1  <?php
   2  
   3  /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
   4  
   5  /**
   6   * Image_Graph - Main class for the graph creation.
   7   *
   8   * PHP versions 4 and 5
   9   *
  10   * LICENSE: This library is free software; you can redistribute it and/or modify
  11   * it under the terms of the GNU Lesser General Public License as published by
  12   * the Free Software Foundation; either version 2.1 of the License, or (at your
  13   * option) any later version. This library is distributed in the hope that it
  14   * will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
  15   * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
  16   * General Public License for more details. You should have received a copy of
  17   * the GNU Lesser General Public License along with this library; if not, write
  18   * to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  19   * 02111-1307 USA
  20   *
  21   * @category   Images
  22   * @package    Image_Graph
  23   * @author     Jesper Veggerby <pear.nosey@veggerby.dk>
  24   * @copyright  Copyright (C) 2003, 2004 Jesper Veggerby Hansen
  25   * @license    http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
  26   * @version    CVS: $Id: Tool.php,v 1.4 2005/09/14 20:27:24 nosey Exp $
  27   * @link       http://pear.php.net/package/Image_Graph
  28   */
  29  
  30  /**
  31   * This class contains a set of tool-functions.
  32   * 
  33   * These functions are all to be called statically
  34   *
  35   * @category   Images
  36   * @package    Image_Graph
  37   * @author     Jesper Veggerby <pear.nosey@veggerby.dk>
  38   * @copyright  Copyright (C) 2003, 2004 Jesper Veggerby Hansen
  39   * @license    http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
  40   * @version    Release: 0.7.2
  41   * @link       http://pear.php.net/package/Image_Graph
  42   */
  43  class Image_Graph_Tool
  44  {
  45  
  46      /**
  47       * Return the average of 2 points
  48       *
  49       * @param double P1 1st point
  50       * @param double P2 2nd point
  51       * @return double The average of P1 and P2
  52       * @static
  53       */
  54      function mid($p1, $p2)
  55      {
  56          return ($p1 + $p2) / 2;
  57      }
  58  
  59      /**
  60       * Mirrors P1 in P2 by a amount of Factor
  61       *
  62       * @param double $p1 1st point, point to mirror
  63       * @param double $o2 2nd point, mirror point
  64       * @param double $factor Mirror factor, 0 returns $p2, 1 returns a pure
  65       * mirror, ie $p1 on the exact other side of $p2
  66       * @return double $p1 mirrored in $p2 by Factor
  67       * @static
  68       */
  69      function mirror($p1, $p2, $factor = 1)
  70      {
  71          return $p2 + $factor * ($p2 - $p1);
  72      }
  73  
  74      /**
  75       * Calculates a Bezier control point, this function must be called for BOTH
  76       * X and Y coordinates (will it work for 3D coordinates!?)
  77       *
  78       * @param double $p1 1st point
  79       * @param double $p2 Point to
  80       * @param double $factor Mirror factor, 0 returns P2, 1 returns a pure
  81       *   mirror, i.e. P1 on the exact other side of P2
  82       * @return double P1 mirrored in P2 by Factor
  83       * @static
  84       */
  85      function controlPoint($p1, $p2, $factor, $smoothFactor = 0.75)
  86      {
  87          $sa = Image_Graph_Tool::mirror($p1, $p2, $smoothFactor);
  88          $sb = Image_Graph_Tool::mid($p2, $sa);
  89  
  90          $m = Image_Graph_Tool::mid($p2, $factor);
  91  
  92          $pC = Image_Graph_Tool::mid($sb, $m);
  93  
  94          return $pC;
  95      }
  96  
  97      /**
  98       * Calculates a Bezier point, this function must be called for BOTH X and Y
  99       * coordinates (will it work for 3D coordinates!?)
 100       *
 101       * @param double $t A position between $p2 and $p3, value between 0 and 1
 102       * @param double $p1 Point to use for calculating control points
 103       * @param double $p2 Point 1 to calculate bezier curve between
 104       * @param double $p3 Point 2 to calculate bezier curve between
 105       * @param double $p4 Point to use for calculating control points
 106       * @return double The bezier value of the point t between $p2 and $p3 using
 107       * $p1 and $p4 to calculate control points
 108       * @static
 109       */
 110      function bezier($t, $p1, $p2, $p3, $p4)
 111      {
 112          // (1-t)^3*p1 + 3*(1-t)^2*t*p2 + 3*(1-t)*t^2*p3 + t^3*p4
 113          return pow(1 - $t, 3) * $p1 +
 114              3 * pow(1 - $t, 2) * $t * $p2 +
 115              3 * (1 - $t) * pow($t, 2) * $p3 +
 116              pow($t, 3) * $p4;
 117      }
 118      
 119      /**
 120       * For a given point (x,y) return a point rotated by a given angle aroung the center (xy,yc)
 121       *
 122       * @param int $x x coordinate of the point to rotate
 123       * @param int $y y coordinate of the point to rotate
 124       * @param int $xc x coordinate of the center of the rotation
 125       * @param int $yc y coordinate of the center of the rotation
 126       * @param int $angle angle of the rotation
 127       * @return array the coordinate of the new point
 128       * @static
 129       */
 130      function rotate($x, $y, $xc, $yc, $angle)
 131      {
 132          $cos = cos(deg2rad($angle));
 133          $sin = sin(deg2rad($angle));
 134          $xr= $x - $xc;
 135          $yr= $y - $yc;
 136          $x1= $xc + $cos * $xr - $sin * $yr;
 137          $y1= $yc + $sin * $xr + $cos * $yr;
 138          return array((int) $x1,(int) $y1);
 139      }
 140  
 141      /**
 142       * If a number is close 0 zero (i.e. 0 within $decimal decimals) it is rounded down to zero
 143       * 
 144       * @param double $value The value to round
 145       * @param int $decimal The number of decimals
 146       * @return double The value or zero if "close enough" to zero
 147       * @static
 148       */
 149      function close2zero($value, $decimal)
 150      {
 151          if (abs($value) < pow(10, -$decimal)) {
 152              return 0;
 153          }
 154          else {
 155              return $value;
 156          }
 157      }
 158      
 159      /**
 160       * Calculate the dimensions and center point (of gravity) for an arc
 161       * 
 162       * @param int $v1 The angle at which the arc starts
 163       * @param int $v2 The angle at which the arc ends
 164       * @return array An array with the dimensions in a fraction of a circle width radius 1 'rx', 'ry' and the
 165       * center point of gravity ('cx', 'cy')
 166       * @static
 167       */
 168      function calculateArcDimensionAndCenter($v1, $v2)
 169      { 
 170          // $v2 always larger than $v1
 171          $r1x = Image_Graph_Tool::close2zero(cos(deg2rad($v1)), 3); 
 172          $r2x = Image_Graph_Tool::close2zero(cos(deg2rad($v2)), 3);
 173          
 174          $r1y = Image_Graph_Tool::close2zero(sin(deg2rad($v1)), 3);
 175          $r2y = Image_Graph_Tool::close2zero(sin(deg2rad($v2)), 3);
 176      
 177          // $rx = how many percent of the x-diameter of the entire ellipse does the arc x-diameter occupy: 1 entire width, 0 no width
 178          // $cx = at what percentage of the diameter does the center lie
 179          
 180          // if the arc passes through 0/360 degrees the "highest" of r1x and r2x is replaced by 1!
 181          if ((($v1 <= 0) && ($v2 >= 0)) || (($v1 <= 360) && ($v2 >= 360))) {
 182              $r1x = min($r1x, $r2x);
 183              $r2x = 1;
 184          } 
 185          
 186          // if the arc passes through 180 degrees the "lowest" of r1x and r2x is replaced by -1!
 187          if ((($v1 <= 180) && ($v2 >= 180)) || (($v1 <= 540) && ($v2 >= 540))) {
 188              $r1x = max($r1x, $r2x);
 189              $r2x = -1;
 190          }
 191          
 192          if ($r1x >= 0) { // start between [270; 360] or [0; 90]        
 193              if ($r2x >= 0) {
 194                  $rx = max($r1x, $r2x) / 2;
 195                  $cx = 0; // center lies 0 percent along this "vector"
 196              }
 197              else {
 198                  $rx = abs($r1x - $r2x) / 2;
 199                  $cx = abs($r2x / 2) / $rx;
 200              }
 201          }
 202          else {  // start between ]90; 270[
 203              if ($r2x < 0) {
 204                  $rx = max(abs($r1x), abs($r2x)) / 2;
 205                  $cx = $rx;
 206              }
 207              else {
 208                  $rx = abs($r1x - $r2x) / 2;
 209                  $cx = abs($r1x / 2) / $rx;
 210              }
 211          }
 212          
 213          // $ry = how many percent of the y-diameter of the entire ellipse does the arc y-diameter occupy: 1 entire, 0 none
 214          // $cy = at what percentage of the y-diameter does the center lie
 215      
 216          // if the arc passes through 90 degrees the "lowest" of r1x and r2x is replaced by -1!
 217          if ((($v1 <= 90) && ($v2 >= 90)) || (($v1 <= 450) && ($v2 >= 450))) {
 218              $r1y = min($r1y, $r2y);
 219              $r2y = 1;
 220          }
 221          
 222          // if the arc passes through 270 degrees the "highest" of r1y and r2y is replaced by -1!
 223          if ((($v1 <= 270) && ($v2 >= 270)) || (($v1 <= 630) && ($v2 >= 630))) {
 224              $r1y = max($r1y, $r2y);
 225              $r2y = -1;
 226          } 
 227              
 228          if ($r1y >= 0) { // start between [0; 180]        
 229              if ($r2y >= 0) {
 230                  $ry = max($r1y, $r2y) / 2;
 231                  $cy = 0; // center lies 0 percent along this "vector"
 232              }
 233              else {
 234                  $ry = abs($r1y - $r2y) / 2;
 235                  $cy = abs($r2y / 2) / $ry;
 236              }
 237          }
 238          else {  // start between ]180; 360[
 239              if ($r2y < 0) {
 240                  $ry = max(abs($r1y), abs($r2y)) / 2;
 241                  $cy = $ry;
 242              }
 243              else {
 244                  $ry = abs($r1y - $r2y) / 2;
 245                  $cy = abs($r1y / 2) / $ry;
 246              }
 247          }
 248          
 249          return array(
 250              'rx' => $rx,
 251              'cx' => $cx,
 252              'ry' => $ry,
 253              'cy' => $cy
 254          );
 255      }
 256      
 257      /**
 258       * Calculate linear regression on a dataset
 259       * @param array $data The data to calculate regression upon
 260       * @return array The slope and intersection of the "best-fit" line
 261       * @static
 262       */    
 263      function calculateLinearRegression(&$data)
 264      {
 265          $sumX = 0; 
 266          $sumY = 0;
 267          foreach ($data as $point) {
 268              $sumX += $point['X'];
 269              $sumY += $point['Y'];
 270          }        
 271          $meanX = $sumX / count($data);
 272          $meanY = $sumY / count($data);
 273  
 274          $sumXX = 0;
 275          $sumYY = 0;
 276          $sumXY = 0;
 277          foreach ($data as $point) {
 278              $sumXX += ($point['X'] - $meanX) * ($point['X'] - $meanX);
 279              $sumYY += ($point['Y'] - $meanY) * ($point['Y'] - $meanY);
 280              $sumXY += ($point['X'] - $meanX) * ($point['Y'] - $meanY);
 281          }        
 282  
 283          $result = array();
 284          $result['slope'] = ($sumXY / $sumXX);
 285          $result['intersection'] = $meanY - ($result['slope'] * $meanX);
 286          return $result;
 287      }
 288      
 289  }
 290  
 291  ?>


Généré le : Sun Feb 25 10:22:19 2007 par Balluche grâce à PHPXref 0.7