code: protected function douglasPeucker(array $line): array
      {
          $distanceMax = 0;
          $index = 0;
  
          $lineSize = count($line);
  
          $pdCalc = new PerpendicularDistance();
  
          for ($i = 1; $i <= ($lineSize - 2); $i++) {
              $distance = $pdCalc->getPerpendicularDistance($line[$i], new Line($line[0], $line[$lineSize - 1]));
  
              if ($distance > $distanceMax) {
                  $index = $i;
                  $distanceMax = $distance;
              }
          }
  
          if ($distanceMax > $this->tolerance) {
              $lineSplitFirst = array_slice($line, 0, $index + 1);
              $lineSplitSecond = array_slice($line, $index, $lineSize - $index);
  
              if (count($lineSplitFirst) > 2) {
                  $resultsSplit1 = $this->douglasPeucker($lineSplitFirst);
              } else {
                  $resultsSplit1 = $lineSplitFirst;
              }
  
              if (count($lineSplitSecond) > 2) {
                  $resultsSplit2 = $this->douglasPeucker($lineSplitSecond);
              } else {
                  $resultsSplit2 = $lineSplitSecond;
              }
  
              array_pop($resultsSplit1);
  
              return array_merge($resultsSplit1, $resultsSplit2);
          }
  
          return [$line[0], $line[$lineSize - 1]];
      }
docs: @param array $line
  
  @return array