# Classes
---
## eos.class.php
### Equation Operating System
This class makes it incredibly easy to use and parse/solve equations in
your own applications. It includes a graph generator to turn an equation
with a variable in to a `y=x` graph, with the capability to calculate
the upper and lower `y-bounds`. __NOTE__ NONE of the functions within
these two classes are static, any example that looks like a static function
call is representational of the class being used, but should be initialized
and assigned to a variable first. It is also important to note that these
classes throw exceptions if running in to errors, please read the beginning
of the `eos.class.php` file for the defines of the exceptions thrown. Exceptions
includes a descriptive message of the error encountered and within `eqEOS` will
also typically include the full equation used.
#### eqEOS
This class has one important function, `eqEOS::solveIF()` which does all the legwork,
so we'll start there and end with examples.
To initialize this class, use:
$eos = new eqEOS();
##### solveIF($infix, $variables)
To use this function:
$value = $eos->solveIF($eq, $vars);
###### _$infix_
Is simply a standard equation with variable support. Variables
have two forms, one is native to PHP programmers already, prefixed with '$'.
The other way to declare a variable is with '&' and is included for
backward compatibility for with the initial version from 2005.
Example Equations:
2(4$x)
2(4&x)
5+ ((1+2)*4) +3
5+4(1+2)+3
10*sin($x)
10*cos($x)
The first two pairs shown are exactly the same. The parser has good implied
multiplication, for everything but allowed functions. Allowed functions require
an implicit operator on either/both sides to work properly, I hope to change
that in the next revision; but for now, note that it will not work as you would
expect.
For example:
5sin(1.5707963267) = 51
5*sin(1.5707963267) = 5
sin(1.5707963267)5 = 15
The reason is because there is no implied multiplication being applied, the result
of `sin(1.5707963267) = 1` is being concatenated with the number 5, giving
incredibly odd results if you are not expecting it.
###### _$variables_
The variables are fairly simple to understand. If it contains a scalar (ie
a non-array value) _every_ variable within the equation will be replaced with
that number. If it contains an array, there will be a by-variable replacement -
note that the array MUST be in the format of `'variable' => value`
Such as:
array(
'x' => 2,
'y' => 3
)
Given the equation:
5$x^$y
If this is called by:
eqEOS::solveIF('5$x^$y', 2)
It will equal '20', as every variable is replaced by 2. However, if called like:
eqEOS::solveIF('5$x^$y', array(
'x' => 2,
'y' => 3);
You will get the result of '40' as it would equate to '5*2^3', as expected.
#### eqGraph
This is the fun class that can create graphs. It extends `eqEOS`.
To initialize use:
$graph = new eqGraph($width, $height);
The `$width` and `$height` are the values used for the image size, defaulting to
a `640x480` image size if initialized with `$graph = new eqGraph();`
##### graph($eq, $xLow, $xHigh, $xStep, [$xyGrid, $yGuess, ...])
This method will generate the graph for the equation (`$eq`) with a min and max
`x` range that it will parse through. All Variables explained:
* `$eq`
The Standard Equation to use. _Must_ have a variable in it. (ie `$x`)
* `$xLow`
The starting point for the calculations - the left side of the graph.
* `$xHigh`
The last point calculated for the variable - the right side of the graph.
* `$xStep`
Stepping point for the variable. Suggested not to use a value less than
`.01`. This is the precision of the graph.
* `$xyGrid = false`
Show `x/y` gridlines on the graph. Defaults to false. Each grid line
is set at every integer (ie `1,2,3,...100`). If working with small ranges,
it is suggested to turn this on.
* `$yGuess = true`
Guess the Lower and Upper `y-bounds` (The bottom and top of the image
respectively.) This will set the the bounds to the lowest `y` value
encountered for the `$yLow`, and the largest `y` value for `$yHight`.
* `$yLow = false`
Lower bound for `y`, will be reset if a lower value for `y` is found.
* `$yHigh = false`
Upper bound for `y`, will be reset if a larger `y` value is found.
TODO:
* Add `x` and `y` labels
* Smart `grid spacing` calculations so can be effective with large ranges.
* Smart (default) `$xStep` calcuations based on image size and ranges.
To set up a graph with a `21x21` window (ie `-10 to 10`) for the equation
`sin($x)` and output as PNG, would use as:
$graph->graph('sin($x)', -10, 10, 0.01, true, false, -10, 10);
$graph->outPNG();
It would look like:
![Sin(x)](http://img825.imageshack.us/img825/1380/sinx21x21.png)
--- |