diff options
author | Kore Nordmann <github@kore-nordmann.de> | 2006-12-20 14:16:56 +0000 |
---|---|---|
committer | Kore Nordmann <github@kore-nordmann.de> | 2006-12-20 14:16:56 +0000 |
commit | 3d159bca6c8d9f22203edabd416d30004dca02c5 (patch) | |
tree | 46ab1ad62a00cee769ba2f9c1e4166172a5ccd17 /src/datasets | |
parent | 1e1dca545ad348cc7ce1be7257fcd2d7e7a4270d (diff) | |
download | zetacomponents-graph-3d159bca6c8d9f22203edabd416d30004dca02c5.zip zetacomponents-graph-3d159bca6c8d9f22203edabd416d30004dca02c5.tar.gz |
- Implemented feature #9402: (Numeric datasets)
Diffstat (limited to 'src/datasets')
-rw-r--r-- | src/datasets/average.php | 7 | ||||
-rw-r--r-- | src/datasets/numeric.php | 286 |
2 files changed, 288 insertions, 5 deletions
diff --git a/src/datasets/average.php b/src/datasets/average.php index 96e790a..1f0773c 100644 --- a/src/datasets/average.php +++ b/src/datasets/average.php @@ -133,14 +133,11 @@ class ezcGraphDataSetAveragePolynom extends ezcGraphDataSet */ public function __get( $propertyName ) { - if ( isset( $this->properties[$propertyName] ) ) + if ( array_key_exists( $propertyName, $this->properties ) ) { return $this->properties[$propertyName]; } - else - { - return parent::__get( $propertyName ); - } + return parent::__get( $propertyName ); } /** diff --git a/src/datasets/numeric.php b/src/datasets/numeric.php new file mode 100644 index 0000000..e33b1bc --- /dev/null +++ b/src/datasets/numeric.php @@ -0,0 +1,286 @@ +<?php +/** + * File containing the ezcGraphNumericDataSet class + * + * @package Graph + * @version //autogentag// + * @copyright Copyright (C) 2005, 2006 eZ systems as. All rights reserved. + * @license http://ez.no/licenses/new_bsd New BSD License + */ +/** + * Dataset for numeric data. + * + * Uses user defined functions for numeric data creation + * + * @property float $start + * Start value for x axis values of function + * @property float $end + * End value for x axis values of function + * @property callback $callback + * Callback function which represents the mathmatical function to + * show + * @property int $resolution + * Steps used to draw line in graph + * + * @package Graph + * @mainclass + */ +class ezcGraphNumericDataSet extends ezcGraphDataSet +{ + /** + * Position of the data iterator. Depends on the configured resolution. + * + * @var int + */ + protected $position = 0; + + /** + * Container to hold the properties + * + * @var array(string=>mixed) + */ + protected $properties; + + /** + * Constructor + * + * @param float $start Start value for x axis values of function + * @param float $end End value for x axis values of function + * @param callback $callback Callback function + * @return void + * @ignore + */ + public function __construct( $start = null, $end = null, $callback = null ) + { + parent::__construct(); + + $this->properties['start'] = null; + $this->properties['end'] = null; + $this->properties['callback'] = null; + + if ( $start !== null ) + { + $this->start = $start; + } + + if ( $end !== null ) + { + $this->end = $end; + } + + if ( $callback !== null ) + { + $this->callback = $callback; + } + + $this->properties['resolution'] = 100; + } + + /** + * Options write access + * + * @throws ezcBasePropertyNotFoundException + * If Option could not be found + * @throws ezcBaseValueException + * If value is out of range + * @param mixed $propertyName Option name + * @param mixed $propertyValue Option value; + * @return mixed + */ + public function __set( $propertyName, $propertyValue ) + { + switch ( $propertyName ) { + case 'resolution': + if ( !is_numeric( $propertyValue ) || + ( $propertyValue < 1 ) ) + { + throw new ezcBaseValueException( $propertyName, $propertyValue, 'int > 1' ); + } + + $this->properties['resolution'] = (int) $propertyValue; + break; + case 'start': + case 'end': + if ( !is_numeric( $propertyValue ) ) + { + throw new ezcBaseValueException( $propertyName, $propertyValue, 'float' ); + } + + $this->properties[$propertyName] = (float) $propertyValue; + break; + case 'callback': + if ( !is_callable( $propertyValue ) ) + { + throw new ezcBaseValueException( $propertyName, $propertyValue, 'callback' ); + } + + $this->properties[$propertyName] = $propertyValue; + break; + default: + parent::__set( $propertyName, $propertyValue ); + break; + } + } + + /** + * Property get access. + * Simply returns a given option. + * + * @param string $propertyName The name of the option to get. + * @return mixed The option value. + * + * @throws ezcBasePropertyNotFoundException + * If a the value for the property options is not an instance of + */ + public function __get( $propertyName ) + { + if ( array_key_exists( $propertyName, $this->properties ) ) + { + return $this->properties[$propertyName]; + } + return parent::__get( $propertyName ); + } + + /** + * Get the x coordinate for the current position + * + * @param int $position Position + * @return float x coordinate + */ + protected function getKey() + { + return $this->start + + ( $this->end - $this->start ) / $this->resolution * $this->position; + } + + /** + * Returns true if the given datapoint exists + * Allows isset() using ArrayAccess. + * + * @param string $key The key of the datapoint to get. + * @return bool Wether the key exists. + */ + public function offsetExists( $key ) + { + return ( ( $key >= $this->start ) && ( $key <= $this->end ) ); + } + + /** + * Returns the value for the given datapoint + * Get an datapoint value by ArrayAccess. + * + * @param string $key The key of the datapoint to get. + * @return float The datapoint value. + */ + public function offsetGet( $key ) + { + return call_user_func( $this->callback, $key ); + } + + /** + * Throws a ezcBasePropertyPermissionException because single datapoints + * cannot be set in average datasets. + * + * @param string $key The kex of a datapoint to set. + * @param float $value The value for the datapoint. + * @throws ezcBasePropertyPermissionException + * Always, because access is readonly. + * @return void + */ + public function offsetSet( $key, $value ) + { + throw new ezcBasePropertyPermissionException( $key, ezcBasePropertyPermissionException::READ ); + } + + /** + * Returns the currently selected datapoint. + * + * This method is part of the Iterator interface to allow access to the + * datapoints of this row by iterating over it like an array (e.g. using + * foreach). + * + * @return string The currently selected datapoint. + */ + final public function current() + { + return call_user_func( $this->callback, $this->getKey() ); + } + + /** + * Returns the next datapoint and selects it or false on the last datapoint. + * + * This method is part of the Iterator interface to allow access to the + * datapoints of this row by iterating over it like an array (e.g. using + * foreach). + * + * @return float datapoint if it exists, or false. + */ + final public function next() + { + if ( $this->start === $this->end ) + { + throw new ezcGraphDatasetAverageInvalidKeysException(); + } + + if ( ++$this->position >= $this->resolution ) + { + return false; + } + else + { + return $this->current(); + } + } + + /** + * Returns the key of the currently selected datapoint. + * + * This method is part of the Iterator interface to allow access to the + * datapoints of this row by iterating over it like an array (e.g. using + * foreach). + * + * @return string The key of the currently selected datapoint. + */ + final public function key() + { + return (string) $this->getKey(); + } + + /** + * Returns if the current datapoint is valid. + * + * This method is part of the Iterator interface to allow access to the + * datapoints of this row by iterating over it like an array (e.g. using + * foreach). + * + * @return bool If the current datapoint is valid + */ + final public function valid() + { + return ( ( $this->getKey() >= $this->start ) && ( $this->getKey() <= $this->end ) ); + } + + /** + * Selects the very first datapoint and returns it. + * This method is part of the Iterator interface to allow access to the + * datapoints of this row by iterating over it like an array (e.g. using + * foreach). + * + * @return float The very first datapoint. + */ + final public function rewind() + { + $this->position = 0; + } + + /** + * Returns the number of elements in this dataset + * + * @return int + */ + public function count() + { + return $this->resolution + 1; + } +} +?> |