Location\Processor\Polyline\Simplify::douglasPeucker PHP Method

douglasPeucker() protected method

protected douglasPeucker ( array $line, float $tolerance ) : array
$line array
$tolerance float
return array
    protected function douglasPeucker(array $line, $tolerance)
    {
        $distanceMax = 0;
        $index = 0;
        $lineSize = count($line);
        for ($i = 1; $i <= $lineSize - 1; $i++) {
            $distance = $this->getPerpendicularDistance($line[$i], new Line($line[0], $line[$lineSize - 1]));
            if ($distance > $distanceMax) {
                $index = $i;
                $distanceMax = $distance;
            }
        }
        if ($distanceMax > $tolerance) {
            $lineSplitFirst = array_slice($line, 0, $index);
            $lineSplitSecond = array_slice($line, $index, $lineSize);
            $recursiveResultsSplitFirst = $this->douglasPeucker($lineSplitFirst, $tolerance);
            $recursiveResultsSplitSecond = $this->douglasPeucker($lineSplitSecond, $tolerance);
            array_pop($recursiveResultsSplitFirst);
            return array_merge($recursiveResultsSplitFirst, $recursiveResultsSplitSecond);
        }
        return [$line[0], $line[$lineSize - 1]];
    }