Алгоритм Рамера – Дугласа – Пекера, также известный как Дуглас– Алгоритм Пекера и итеративный алгоритм подбора конечной точки - это алгоритм, который прореживает кривую, состоящую из линейных сегментов, до аналогичной кривой с меньшим количеством точек. Это был один из первых успешных алгоритмов, разработанных для картографического обобщения.
Цель алгоритма, учитывая кривую, состоящую из отрезков линии (которая в некоторых контекстах также называется ломаной линией), чтобы найти аналогичную кривую с меньшим количеством точек. Алгоритм определяет «несходство» на основе максимального расстояния между исходной кривой и упрощенной кривой (т. Е. расстояние Хаусдорфа между кривыми). Упрощенная кривая состоит из подмножества точек, определяющих исходную кривую.
Начальная кривая - это упорядоченный набор точек или линий и размерность расстояния ε>0.
Алгоритм рекурсивно делит строку. Первоначально ему даются все баллы между первой и последней точкой. Он автоматически отмечает первую и последнюю точку, которую нужно сохранить. Затем он находит точку, которая наиболее удалена от отрезка линии, причем первая и последняя точки являются конечными точками; эта точка, очевидно, самая дальняя на кривой от аппроксимирующего отрезка прямой между конечными точками. Если точка находится ближе, чем ε к отрезку линии, то любые точки, которые в настоящее время не отмечены для сохранения, могут быть отброшены без того, чтобы упрощенная кривая была хуже, чем ε.
Если точка, наиболее удаленная от отрезка линии, больше ε от аппроксимации, то эту точку необходимо сохранить. Алгоритм рекурсивно вызывает себя с первой точкой и самой дальней точкой, а затем с самой дальней точкой и последней точкой, которая включает самую дальнюю точку, отмеченную как сохраняемую.
Когда рекурсия завершена, может быть сгенерирована новая выходная кривая, состоящая из всех и только тех точек, которые были отмечены как сохраненные.
Эффект изменения эпсилон в параметрической реализации RDPВыбор ε обычно определяется пользователем. Как и большинство методов аппроксимации линий / полигональной аппроксимации / обнаружения доминирующих точек, его можно сделать непараметрическим, используя границу ошибки из-за оцифровки / квантования в качестве условия завершения.
(Предполагается ввод - массив с единицей)
function DouglasPeucker (PointList, epsilon) // Найти точку с максимальным расстоянием dmax = 0 index = 0 end = length (PointList) для от i = 2 до (конец - 1) {d = perpendicularDistance (PointList [i], Line (PointList [1], PointList [end])) if (d>dmax) {index = i dmax = d}} ResultList = пусто; // Если максимальное расстояние больше, чем эпсилон, рекурсивно упростить if (dmax>epsilon) {// Рекурсивный вызов recResults1 = DouglasPeucker (PointList [1... index], epsilon) recResults2 = DouglasPeucker (PointList [ index... end], epsilon) // Создаем список результатов ResultList = {recResults1 [1... length (recResults1) - 1], recResults2 [1... length (recResults2)]}} else {ResultList = {PointList [1], PointList [end]}} // Вернуть результат return ResultList end
Ссылка: https://karthaus.nl/ rdp /
Алгоритм используется для обработки векторной графики и картографического обобщения. Он не всегда сохраняет свойство несамопересечения кривых, что привело к разработке альтернативных алгоритмов.
Алгоритм широко используется в робототехнике для выполнения упрощения и уменьшения шума данных о диапазоне, полученных вращением сканер диапазона ; в этом поле он известен как алгоритм разделения и слияния и относится к Дуда и Харт.
Время выполнения этого алгоритма при запуске на полилиния, состоящая из сегментов и вершин, задается повторением где - значение индекса в псевдокоде. В худшем случае или в каждом рекурсивный вызов, и этот алгоритм имеет время выполнения . В лучшем случае или при каждом рекурсивном вызове, и в этом случае время выполнения имеет хорошо известное решение (с помощью основной теоремы для повторений «разделяй и властвуй» ) .
Используя (полностью или частично) структуры данных с динамической выпуклой оболочкой, упрощение, выполняемое алгоритмом, может быть выполнено за времени.
Альтернативные алгоритмы для упрощения линий включают: