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]];
}