The starting curve is an ordered set of points or lines and the distance dimension . The algorithm
recursively divides the line. Initially it is given all the points between the first and last point. It automatically marks the first and last point to be kept. It then finds the point that is farthest from the
line segment with the first and last points as end points; this point is always farthest on the curve from the approximating line segment between the end points. If the point is closer than to the line segment, then any points not currently marked to be kept can be discarded without the simplified curve being worse than . If the point farthest from the line segment is greater than from the approximation then that point must be kept. The algorithm recursively calls itself with the first point and the farthest point and then with the farthest point and the last point, which includes the farthest point being marked as kept. When the recursion is completed a new output curve can be generated consisting of all and only those points that have been marked as kept.
Non-parametric Ramer–Douglas–Peucker The choice of is usually user-defined. Like most line fitting, polygonal approximation or dominant point detection methods, it can be made non-parametric by using the error bound due to digitization and quantization as a termination condition.
Pseudocode Assuming the input is a one-based array: # source: https://karthaus.nl/rdp/ function DouglasPeucker(PointList[], epsilon) # Find the point with the maximum distance dmax = 0 index = 0 end = length(PointList) for i = 2 to (end - 1) { d = perpendicularDistance(PointList[i], Line(PointList[1], PointList[end])) if (d > dmax) { index = i dmax = d } } ResultList[] = empty; # If max distance is greater than epsilon, recursively simplify if (dmax > epsilon) { # Recursive call recResults1[] = DouglasPeucker(PointList[1...index], epsilon) recResults2[] = DouglasPeucker(PointList[index...end], epsilon) # Build the result list ResultList[] = {recResults1[1...length(recResults1) - 1], recResults2[1...length(recResults2)]} } else { ResultList[] = {PointList[1], PointList[end]} } # Return the result return ResultList[] == Application ==