Я хотел бы реализовать Ramer–Douglas–Peucker_algorithm в C++.Помогите с пониманием этого алгоритма
код Псевдо выглядит следующим образом:
function DouglasPeucker(PointList[], epsilon)
//Find the point with the maximum distance
dmax = 0
index = 0
for i = 2 to (length(PointList) - 1)
d = OrthogonalDistance(PointList[i], Line(PointList[1], PointList[end]))
if d > dmax
index = i
dmax = d
end
end
//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...end-1] recResults2[1...end]}
else
ResultList[] = {PointList[1], PointList[end]}
end
//Return the result
return ResultList[]
end
Вот мое понимание до сих пор. Это рекурсивная функция, принимающая массив точек и порог расстояния.
Затем он выполняет итерацию по текущим точкам, чтобы найти точку с максимальным расстоянием.
Я немного потерял функцию Ортографического расстояния. Как это вычислить? Я никогда не видел, чтобы функция расстояния принимала сегмент линии в качестве параметра.
Я думаю, что в стороне от этого я должен быть в порядке, я просто использую std :: векторы для массивов. Я думаю, что я буду использовать std :: copy, а затем нажмите или поп в соответствии с тем, что говорит алгоритм.
Благодаря
Ну, не Ортогональное Сопротивление должно рассчитывать ортогональное расстояние точки до линии? Конечно, строка содержит 2 очка. Вероятно, вы можете рассчитать это с помощью некоторой базовой тригонометрии. – futureelite7