/** * Calculate elevation value * * This method does directly update the route object. */ public function calculateElevation() { $Calculator = new Calculation\Calculator($this->Route->elevations()); $Calculator->calculate(); $this->Route->set(Route\Entity::ELEVATION, $Calculator->totalElevation()); $this->Route->set(Route\Entity::ELEVATION_UP, $Calculator->elevationUp()); $this->Route->set(Route\Entity::ELEVATION_DOWN, $Calculator->elevationDown()); }
/** * Run recalculations */ public function run() { $Query = $this->getQuery(); $Update = $this->prepareUpdate(); while ($Data = $Query->fetch()) { $Elevation = \Runalyze\Model\Object::explode($Data['elevations']); $Calculator = new Elevation\Calculation\Calculator($Elevation); $Calculator->calculate(); if ($Calculator->totalElevation() != $Data['elevation'] || $Calculator->elevationUp() != $Data['elevation_up']) { $Update->bindValue(':id', $Data['id']); $Update->bindValue(':elevation', $Calculator->totalElevation()); $Update->bindValue(':elevation_up', $Calculator->elevationUp()); $Update->bindValue(':elevation_down', $Calculator->elevationDown()); $Update->execute(); $this->NumberOfRoutes++; } $this->Results[$Data['id']] = array($Calculator->totalElevation(), $Calculator->elevationUp(), $Calculator->elevationDown()); } }
public function testAlgorithmDouglasPeucker() { $Method = new ElevationMethod(); $Method->set(ElevationMethod::DOUGLAS_PEUCKER); $Calc = new Calculator(array(0, 2, 4, 6, 5, 7, 4, 8, 10, 0), $Method, 2); $Calc->calculate(); $this->assertEquals(13, $Calc->totalElevation()); $this->assertEquals(13, $Calc->elevationUp()); $this->assertEquals(13, $Calc->elevationDown()); }
/** * Get different algorithms for * @param array $array * @return string */ protected function getDifferentAlgorithmsFor($array) { $Method = new ElevationMethod(); $Calculator = new Elevation\Calculation\Calculator($array); $TresholdRange = range(1, 10); $Algorithms = array(array(ElevationMethod::NONE, false), array(ElevationMethod::THRESHOLD, true), array(ElevationMethod::DOUGLAS_PEUCKER, true)); $Code = '<table class="fullwidth zebra-style small">'; $Code .= '<thead>'; $Code .= '<tr><th class="r">' . __('Threshold') . ':</th>'; foreach ($TresholdRange as $t) { $Code .= '<th>' . $t . '</th>'; } $Code .= '</tr>'; $Code .= '</thead>'; $Code .= '<tbody>'; foreach ($Algorithms as $Algorithm) { $Method->set($Algorithm[0]); $Calculator->setMethod($Method); $Code .= '<tr><td class="b">' . $Method->valueAsLongString() . '</td>'; if ($Algorithm[1]) { foreach ($TresholdRange as $t) { $highlight = Configuration::ActivityView()->elevationMinDiff() == $t && Configuration::ActivityView()->elevationMethod()->value() == $Algorithm[0] ? ' highlight' : ''; $Calculator->setThreshold($t); $Calculator->calculate(); $Code .= '<td class="r' . $highlight . '">' . $Calculator->totalElevation() . ' m</td>'; } } else { $Calculator->calculate(); $Code .= '<td class="c' . (Configuration::ActivityView()->elevationMethod()->value() == $Algorithm[0] ? ' highlight' : '') . '" colspan="' . count($TresholdRange) . '">' . $Calculator->totalElevation() . ' m</td>'; } $Code .= '</tr>'; } $Code .= '</tbody>'; $Code .= '</table>'; return $Code; }