道格拉斯-普克算法(Douglas-Peucker Algorithm)的详细原理介绍
道格拉斯-普克算法(Douglas–Peucker algorithm),又称 Ramer–Douglas–Peucker algorithm,是一种用于简化折线或多边形边界的经典算法。它由 David H. Douglas 和 Thomas K. Peucker 于1973年提出,广泛应用于地图制图、地理信息系统(GIS)、计算机图形学、机器人路径规划和数据压缩等领域。
算法目标
给定点序列:
P = [P₁, P₂, ..., Pₙ]
在容差 ε(epsilon)下,生成简化序列 P′,满足:
- P′ 是 P 的子集
- 所有被删除点到近似线段的最大垂直距离 ≤ ε
- 尽可能减少点数
算法步骤(递归)
- 连接首尾:构造线段 L = P₁Pₙ
- 找最远点:计算每个中间点 Pᵢ(i=2..n−1)到 L 的垂直距离 dᵢ
- 求最大距离:dₘₐₓ = max(d₂, d₃, ..., dₙ₋₁)
- 比较容差:
- 若 dₘₐₓ ≤ ε → 删除中间所有点,仅保留 P₁ 和 Pₙ
- 若 dₘₐₓ > ε → 保留最远点 Pₘₐₓ,并递归处理 [P₁..Pₘₐₓ] 和 [Pₘₐₓ..Pₙ]
垂直距离计算
输入:
- 点 P = (x₀, y₀)
- 线段端点 A = (x₁, y₁), B = (x₂, y₂)
1. 计算向量
AB⃗ = (Δx, Δy) = (x₂ − x₁, y₂ − y₁)
AP⃗ = (x₀ − x₁, y₀ − y₁)
2. 计算投影参数 t,其值为:
(x₀ − x₁)(x₂ − x₁) + (y₀ − y₁)(y₂ − y₁)
───────────────────────
(x₂ − x₁)² + (y₂ − y₁)²
3. 截断 t 到 [0,1]
t′ = max(0, min(1, t))
4. 投影点坐标
xₚ = x₁ + t′ × (x₂ − x₁)
yₚ = y₁ + t′ × (y₂ − y₁)
5. 垂直距离
d = √[(x₀ − xₚ)² + (y₀ − yₚ)²]
示例
原始点列:
P = [P₁(0,0), P₂(1,1), P₃(2,0), P₄(3,1), P₅(4,0)]
设 ε = 0.8
- 第一步:P₁P₅ 线段,P₂、P₃、P₄ 中 P₂ 和 P₄ 距离较大
- 计算得 d(P₂,P₁P₅) ≈ 0.707 < 0.8?否(实际 > ε,需保留)
- 最终可能保留:P₁, P₂, P₃, P₅ 或进一步简化
(注:具体保留点取决于 ε 值)
优缺点
优点 ✅ | 缺点 ❌ |
---|---|
• 形状保持好 | • 最坏时间复杂度 O(n²) |
• 参数 ε 直观 | • 深度递归可能栈溢出 |
• 输出点必为输入子集 | • 对噪声敏感 |
• 广泛支持(GIS, SVG, etc.) | • 非最优解(不保证最少点数) |
应用场景
- 地图缩放:道路、河流、边界简化
- GPS 轨迹压缩(减少存储)
- 矢量图形优化(SVG, CAD)
- 多边形轮廓提取
- 机器人路径规划
总结
道格拉斯-普克算法是一种基于递归分割和距离容差的经典折线简化方法。该算法简洁、高效、直观,是空间数据简化领域的工业标准之一。