道格拉斯-普克算法

拉默-道格拉斯-普克演算法（Ramer–Douglas–Peucker algorithm），又稱道格拉斯-普克演算法（Douglas–Peucker algorithm）和迭代端點擬合算法（iterative end-point fit algorithm），是一種將線段組成的曲線降採樣為點數較少的類似曲線的算法。它是最早成功地用於cartographic generalization的算法之一。

**思路**
該算法的目的是，給定一條由線段構成的曲線（在某些情況下也稱為折線），找到一條點數較少的相似曲線。該算法根據原曲線與簡化曲線之間的最大距離（即曲線之間的豪斯多夫距離）來定義 "不相似"。簡化曲線由定義原始曲線的點的子集組成。

**算法**
用道格拉斯-普克算法簡化一條分段線性曲線。
起始曲線是一組有序的點或線，距離維度 ε > 0。
該算法遞歸劃分線。最初，它被賦予了第一點和最後一點之間的所有點。它自動標記要保留的第一點和最後一點。然後它找到離以第一點和最後一點為終點的線段最遠的點；這個點顯然是曲線上離終點之間的近似線段最遠的點。如果這個點離線段的距離比 ε 更近，那麼在簡化曲線不比 ε 差的情況下，可以捨棄任何當前沒有標記保留的點。
如果離線段最遠的點大於近似值 ε，那麼該點必須保留。該算法以第一點和最遠點遞歸調用自身，然後以最遠點和最後一點調用自身，其中包括最遠點被標記為保留。
當遞歸完成後，可以生成一條新的輸出曲線，該曲線由所有且僅由那些被標記為保留的點組成。
在RDP的參數化實現中，改變 ε 的影響。

**非參數化的拉默-道格拉斯-普克演算法**
ε 的選擇通常由用戶定義。像大多數線擬合/多邊形逼近/主點檢測方法一樣，它可以通過使用數字化/量化引起的誤差邊界作為終止條件來實現非參數化。

**偽代碼**
（假設輸入是一個索引從1開始的數組）
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(PointListi, Line(PointList1, PointListend))
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(PointList1...index, epsilon)
recResults2 = DouglasPeucker(PointListindex...end, epsilon)

// Build the result list
ResultList = {recResults11...length(recResults1) - 1, recResults21...length(recResults2)}
} else {
ResultList = {PointList1, PointListend}
}
// Return the result
return ResultList
end
鏈接：https://karthaus.nl/rdp/ date=20210423021404 

**應用**
該算法用於處理矢量圖形和cartographic generalization。它並不總是保留曲線的非自交屬性，這導致了變體算法的發展。
該算法廣泛應用於機器人技術中，對旋轉式測距掃描儀獲取的測距數據進行簡化和去噪處理；在這個領域，它被稱為分割合併算法，歸功於Duda和Hart。

**複雜度**
該算法在由  段和  個頂點組成的折線上運行時的時間由遞歸  給出，其中  是偽代碼中的索引值。在最壞的情況下，每次遞歸調用時， 或 ，該算法的運行時間為 。在最好的情況下，在每次遞歸調用時， 或 ，在這種情況下，運行時間具有  的眾所周知的解（通過分治法的主定理）。
使用（全或半）Dynamic convex hull數據結構，算法所進行的簡化可以在  時間內完成。

**類似算法**
線簡化的替代算法包括：- Visvalingam–Whyatt- Reumann–Witkam- Opheim simplification- Lang simplification- Zhao-Saalfeld

**參見**
 曲線擬合

**延伸閱讀**
 Urs Ramer, "An iterative procedure for the polygonal approximation of plane curves", Computer Graphics and Image Processing, 1(3), 244–256 (1972) 10.1016/S0146-664X(72)80017-0- David Douglas & Thomas Peucker, "Algorithms for the reduction of the number of points required to represent a digitized line or its caricature", The Canadian Cartographer 10(2), 112–122 (1973) 10.3138/FM57-6770-U75U-7727- John Hershberger & Jack Snoeyink, "Speeding Up the Douglas–Peucker Line-Simplification Algorithm", Proc 5th Symp on Data Handling, 134–143 (1992). UBC Tech Report TR-92-07 available at http://www.cs.ubc.ca/cgi-bin/tr/1992/TR-92-07 date=20160414023022 - R.O. Duda and P.E. Hart, "Pattern classification and scene analysis", (1973), Wiley, New York (https://web.archive.org/web/20110715184521/http://rii.ricoh.com/~stork/DHS.html)- archive-url = https://web.archive.org/web/20210130233206/https://hydra.hull.ac.uk/assets/hull:8338/content 

**參考文獻**

**外部鏈接**
  Boost.Geometry支持Douglas-Peucker簡化算法。 date=20180428011652 -  Ramer-Douglas-Peucker等簡化算法的C++開源實現 date=20190712193144 -  用於KML數據的算法的XSLT實現。 date=20201117171227 -  您可以在本頁底部看到應用於自行車騎行的GPS日誌的算法。 date=20200224062759 -  此算法的交互式可視化 date=20210423021404 -  F#實現 date=20201019205038 -  Ruby gem實現 date=20210120014745 -  JTS, Java Topology Suite date=20210427170709 ，包含了許多算法的Java實現，包括 Douglas-Peucker算法 date=20201016014335 。