linea21-externals
[ class tree: linea21-externals ] [ index: linea21-externals ] [ all elements ]

Source for file MathPlot.class.php

Documentation is available at MathPlot.class.php

  1. <?php
  2. /*
  3.  * This work is hereby released into the Public Domain.
  4.  * To view a copy of the public domain dedication,
  5.  * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to
  6.  * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
  7.  *
  8.  */
  9.  
  10. require_once dirname(__FILE__)."/Component.class.php";
  11.  
  12. /**
  13.  * A mathematic function
  14.  *
  15.  * @package linea21.externals
  16.  * @subpackage artichow
  17.  */
  18. class awMathFunction {
  19.  
  20.   /**
  21.    * Function line
  22.    *
  23.    * @var Line 
  24.    */
  25.   var $line;
  26.  
  27.   /**
  28.    * Marks for your plot
  29.    *
  30.    * @var Mark 
  31.    */
  32.   var $mark;
  33.  
  34.   /**
  35.    * Callback function
  36.    *
  37.    * @var string 
  38.    */
  39.   var $f;
  40.  
  41.   /**
  42.    * Start the drawing from this value
  43.    *
  44.    * @var float 
  45.    */
  46.   var $fromX;
  47.  
  48.   /**
  49.    * Stop the drawing at this value
  50.    *
  51.    * @var float 
  52.    */
  53.   var $toX;
  54.  
  55.   /**
  56.    * Line color
  57.    *
  58.    * @var Color 
  59.    */
  60.   var $color;
  61.  
  62.   /**
  63.    * Construct the function
  64.    *
  65.    * @param string $f Callback function
  66.    * @param float $fromX 
  67.    * @param float $toX 
  68.    */
  69.   function awMathFunction($f$fromX NULL$toX NULL{
  70.  
  71.     $this->f = (string)$f;
  72.     $this->fromX = is_null($fromXNULL : (float)$fromX;
  73.     $this->toX = is_null($toXNULL : (float)$toX;
  74.  
  75.     $this->line = new awLine;
  76.     $this->mark = new awMark;
  77.     $this->color = new awBlack;
  78.  
  79.   }
  80.  
  81.   /**
  82.    * Change line color
  83.    *
  84.    * @param $color A new awcolor
  85.    */
  86.   function setColor($color{
  87.     $this->color = $color;
  88.   }
  89.  
  90.   /**
  91.    * Get line color
  92.    *
  93.    * @return Color 
  94.    */
  95.   function getColor({
  96.     return $this->color;
  97.   }
  98.  
  99.   /**
  100.    * Get the background color or gradient of an element of the component
  101.    *
  102.    * @return Color, Gradient
  103.    */
  104.   function getLegendBackground({
  105.   }
  106.  
  107.   /**
  108.    * Get the line thickness
  109.    *
  110.    * @return NULL 
  111.    */
  112.   function getLegendLineThickness({
  113.     return $this->line->getThickness();
  114.   }
  115.  
  116.   /**
  117.    * Get the line type
  118.    *
  119.    * @return NULL 
  120.    */
  121.   function getLegendLineStyle({
  122.     return $this->line->getStyle();
  123.   }
  124.  
  125.   /**
  126.    * Get the color of line
  127.    *
  128.    * @return NULL 
  129.    */
  130.   function getLegendLineColor({
  131.     return $this->color;
  132.   }
  133.  
  134.   /**
  135.    * Get a mark object
  136.    *
  137.    * @return NULL 
  138.    */
  139.   function getLegendMark({
  140.     return $this->mark;
  141.   }
  142.  
  143. }
  144.  
  145. registerClass('MathFunction');
  146.  
  147. /**
  148.  * For mathematics functions
  149.  *
  150.  * @package linea21.externals
  151.  * @subpackage artichow
  152.  */
  153. class awMathPlot extends awComponent {
  154.  
  155.   /**
  156.    * Functions
  157.    *
  158.    * @var array 
  159.    */
  160.   var $functions = array();
  161.  
  162.   /**
  163.    * Grid properties
  164.    *
  165.    * @var Grid 
  166.    */
  167.   var $grid;
  168.  
  169.   /**
  170.    * X axis
  171.    *
  172.    * @var Axis 
  173.    */
  174.   var $xAxis;
  175.  
  176.   /**
  177.    * Y axis
  178.    *
  179.    * @var Axis 
  180.    */
  181.   var $yAxis;
  182.  
  183.   /**
  184.    * Extremum
  185.    *
  186.    * @var Side 
  187.    */
  188.   var $extremum NULL;
  189.  
  190.   /**
  191.    * Interval
  192.    *
  193.    * @var float 
  194.    */
  195.   var $interval 1;
  196.  
  197.   /**
  198.    * Build the plot
  199.    *
  200.    * @param int $xMin Minimum X value
  201.    * @param int $xMax Maximum X value
  202.    * @param int $yMax Maximum Y value
  203.    * @param int $yMin Minimum Y value
  204.    */
  205.   function awMathPlot($xMin$xMax$yMax$yMin{
  206.  
  207.     parent::awComponent();
  208.  
  209.     $this->setPadding(8888);
  210.  
  211.     $this->grid = new awGrid;
  212.  
  213.     // Hide grid by default
  214.     $this->grid->hide(TRUE);
  215.  
  216.     // Set extremum
  217.     $this->extremum new awSide($xMin$xMax$yMax$yMin);
  218.  
  219.     // Create axis
  220.     $this->xAxis = new awAxis;
  221.     $this->xAxis->setTickStyle(TICK_IN);
  222.     $this->xAxis->label->hideValue(0);
  223.     $this->initAxis($this->xAxis);
  224.  
  225.     $this->yAxis = new awAxis;
  226.     $this->yAxis->setTickStyle(TICK_IN);
  227.     $this->yAxis->label->hideValue(0);
  228.     $this->initAxis($this->yAxis);
  229.  
  230.   }
  231.  
  232.   function initAxis(&$axis{
  233.  
  234.     $axis->setLabelPrecision(1);
  235.     $axis->addTick('major'new awTick(05));
  236.     $axis->addTick('minor'new awTick(03));
  237.     $axis->addTick('micro'new awTick(01));
  238.     $axis->setNumberByTick('minor''major'1);
  239.     $axis->setNumberByTick('micro''minor'4);
  240.     $axis->label->setFont(new awTuffy(7));
  241.  
  242.   }
  243.  
  244.   /**
  245.    * Interval to calculate values
  246.    *
  247.    * @param float $interval 
  248.    */
  249.   function setInterval($interval{
  250.     $this->interval = (float)$interval;
  251.   }
  252.  
  253.   /**
  254.    * Add a formula f(x)
  255.    *
  256.    * @param &$function 
  257.    * @param string $name Name for the legend (can be NULL if you don't want to set a legend)
  258.    * @param int $type Type for the legend
  259.    */
  260.   function add(&$function$name NULL$type LEGEND_LINE{
  261.  
  262.     $this->functions[$function;
  263.  
  264.     if($name !== NULL{
  265.       $this->legend->add($function$name$type);
  266.     }
  267.  
  268.   }
  269.  
  270.   function init($driver{
  271.  
  272.     list($x1$y1$x2$y2$this->getPosition();
  273.  
  274.     $this->xAxis->line->setX($x1$x2);
  275.     $this->xAxis->label->setAlign(NULLLABEL_BOTTOM);
  276.     $this->xAxis->label->move(03);
  277.     $this->xAxis->setRange($this->extremum->left$this->extremum->right);
  278.  
  279.     $this->yAxis->line->setY($y2$y1);
  280.     $this->yAxis->label->setAlign(LABEL_RIGHT);
  281.     $this->yAxis->label->move(-60);
  282.     $this->yAxis->reverseTickStyle();
  283.     $this->yAxis->setRange($this->extremum->bottom$this->extremum->top);
  284.  
  285.  
  286.     $this->xAxis->setYCenter($this->yAxis0);
  287.     $this->yAxis->setXCenter($this->xAxis0);
  288.  
  289.     if($this->yAxis->getLabelNumber(=== NULL{
  290.       $number $this->extremum->top $this->extremum->bottom 1;
  291.       $this->yAxis->setLabelNumber($number);
  292.     }
  293.  
  294.     if($this->xAxis->getLabelNumber(=== NULL{
  295.       $number $this->extremum->right $this->extremum->left 1;
  296.       $this->xAxis->setLabelNumber($number);
  297.     }
  298.  
  299.     // Set ticks
  300.  
  301.     $this->xAxis->ticks['major']->setNumber($this->xAxis->getLabelNumber());
  302.     $this->yAxis->ticks['major']->setNumber($this->yAxis->getLabelNumber());
  303.  
  304.  
  305.     // Set axis labels
  306.     $labels array();
  307.     for($i 0$count $this->xAxis->getLabelNumber()$i $count$i++{
  308.       $labels[$i;
  309.     }
  310.     $this->xAxis->label->set($labels);
  311.  
  312.     $labels array();
  313.     for($i 0$count $this->yAxis->getLabelNumber()$i $count$i++{
  314.       $labels[$i;
  315.     }
  316.     $this->yAxis->label->set($labels);
  317.  
  318.     parent::init($driver);
  319.  
  320.     // Create the grid
  321.     $this->createGrid();
  322.  
  323.     // Draw the grid
  324.     $this->grid->draw($driver$x1$y1$x2$y2);
  325.  
  326.   }
  327.  
  328.   function drawEnvelope($driver{
  329.  
  330.     // Draw axis
  331.     $this->xAxis->draw($driver);
  332.     $this->yAxis->draw($driver);
  333.  
  334.   }
  335.  
  336.   function drawComponent($driver$x1$y1$x2$y2$aliasing{
  337.  
  338.     foreach($this->functions as $function{
  339.  
  340.       $f $function->f;
  341.       $fromX is_null($function->fromX$this->extremum->left $function->fromX;
  342.       $toX is_null($function->toX$this->extremum->right $function->toX;
  343.           
  344.       $old NULL;
  345.           
  346.       for($i $fromX$i <= $toX$i += $this->interval{
  347.             
  348.         $p awAxis::toPosition($this->xAxis$this->yAxisnew awPoint($i$f($i)));
  349.  
  350.         if($p->>= $y1 and $p-><= $y2{
  351.           $function->mark->draw($driver$p);
  352.         }
  353.             
  354.         if($old !== NULL{
  355.  
  356.           $line $function->line;
  357.           $line->setLocation($old$p);
  358.  
  359.           if(
  360.           ($line->p1->>= $y1 and $line->p1-><= $y2or
  361.           ($line->p2->>= $y1 and $line->p2-><= $y2)
  362.           {
  363.             $driver->line(
  364.             $function->getColor(),
  365.             $line
  366.             );
  367.           }
  368.  
  369.         }
  370.  
  371.         $old $p;
  372.             
  373.       }
  374.           
  375.       // Draw last point if needed
  376.       if($old !== NULL and $i $this->interval != $toX{
  377.             
  378.         $p awAxis::toPosition($this->xAxis$this->yAxisnew awPoint($toX$f($toX)));
  379.  
  380.         if($p->>= $y1 and $p-><= $y2{
  381.           $function->mark->draw($driver$p);
  382.         }
  383.  
  384.  
  385.         $line $function->line;
  386.         $line->setLocation($old$p);
  387.  
  388.         if(
  389.         ($line->p1->>= $y1 and $line->p1-><= $y2or
  390.         ($line->p2->>= $y1 and $line->p2-><= $y2)
  391.         {
  392.           $driver->line(
  393.           $function->getColor(),
  394.           $line
  395.           );
  396.         }
  397.  
  398.       }
  399.  
  400.     }
  401.  
  402.   }
  403.  
  404.   function createGrid({
  405.  
  406.     // Horizontal lines of the grid
  407.  
  408.     $major $this->yAxis->tick('major');
  409.     $interval $major->getInterval();
  410.     $number $this->yAxis->getLabelNumber(1;
  411.  
  412.     $h array();
  413.     if($number 0{
  414.       for($i 0$i <= $number$i++{
  415.         $h[$i $number;
  416.       }
  417.     }
  418.  
  419.     // Vertical lines
  420.  
  421.     $major $this->xAxis->tick('major');
  422.     $interval $major->getInterval();
  423.     $number $this->xAxis->getLabelNumber(1;
  424.  
  425.     $w array();
  426.     if($number 0{
  427.       for($i 0$i <= $number$i++{
  428.         if($i%$interval === 0{
  429.           $w[$i $number;
  430.         }
  431.       }
  432.     }
  433.  
  434.     $this->grid->setGrid($w$h);
  435.  
  436.   }
  437.  
  438. }
  439.  
  440. registerClass('MathPlot');
  441. ?>

Documentation generated on Thu, 03 May 2012 15:06:16 +0200 by phpDocumentor 1.4.1