/** * 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()); }
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()); }
/** * 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()); } }
/** * @param \Runalyze\Data\Laps\Lap $Lap */ protected function addElevationFor(Lap $Lap) { if ($this->RouteLoop == null) { return; } $Calculator = new Elevation\Calculation\Calculator($this->RouteLoop->sliceElevation()); $Calculator->calculate(); $Lap->setElevation($Calculator->elevationUp(), $Calculator->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; }
/** * Construct plot data * @param enum $algorithm * @param int $treshold * @return array */ protected function constructPlotDataFor($algorithm, $treshold = false) { $Method = new ElevationMethod(); $Method->set($algorithm); if ($treshold === false) { $treshold = Configuration::ActivityView()->elevationMinDiff(); } $Calculator = new Data\Elevation\Calculation\Calculator($this->Context->route()->elevations()); $Calculator->setMethod($Method); $Calculator->setThreshold($treshold); $Calculator->calculate(); $i = 0; $Data = array(); $Points = $Calculator->strategy()->smoothedData(); $Indices = $Calculator->strategy()->smoothingIndices(); $hasDistances = $this->Context->trackdata()->get(Trackdata\Entity::DISTANCE); $Distances = $this->Context->trackdata()->get(Trackdata\Entity::DISTANCE); $Times = $this->Context->trackdata()->get(Trackdata\Entity::TIME); $num = $this->Context->trackdata()->num(); foreach ($Indices as $i => $index) { if ($index >= $num) { $index = $num - 1; } if ($hasDistances) { $Data[(string) $Distances[$index]] = $Points[$i]; } else { $Data[(string) $Times[$index] . '000'] = $Points[$i]; } } $this->manipulateData($Data); return $Data; }