Douglas-Peucker算法

简介

Douglas-Peucker算法[1]用于曲线点的抽稀。一个典型的应用是对地图数据进行压缩,在不损失原数据所表现出的形状的基础上,使用尽可能少的数据。John HershbergerJack Snoeyink给出了C语言的实现[2],然而该算法在做坏情况下的计算复杂度为 Jonathan de Halleux 给出了基于路径凸壳递归方法的C++实现DPApprox[3]Elmar de Koning也给出了自己的实现方案psimpl[4]。本文只从工程的角度介绍如何使用后面两个软件包,而不是从科研角度讲解DP抽稀算法的原理和程序实现的细节。

DPApprox的程序结构设计和使用

为了增强可扩展性,DPApprox软件包使用了C++模板,这样用户可以使用任意数据类型(整数型、浮点型、双精度浮点型等)表示曲线上的点坐标值。曲线上的点用类TPoint描述。整条输入曲线(即曲线上的所有点)用类PointContainer表示,输出的关键点用类KeyContainer表示。PointContainerKeyContainer都提供了类似C++标准库中类vector的常见函数,如clear,size,resize,const_iterator,iterator,operator[]等。

抽稀算法实现用类TLineApproximator描述,注意到TLineApproximator只是一个基类,本身不提供具体的算法实现(即虚拟函数ComputeKeys的定义)。而功能的实现由TLineApproximator的子类实现,作者给出了类TDPHull

 

关于如何使用DPApprox软件包可以参考示例程序douglas。类TLineApproximator提供了一系列的公共接口,以便用户定制程序运行时特性和实现功能。下表对主要的公共接口函数给出了总结。

公共接口函数

功能介绍

SetNormalization

对曲线上所有点的坐标值做归一化处理以提高计算精确度,建议用户使用此设置。

SetPoints,GetPoints

获取曲线上的所有点。

GetKeys

获取计算得到的关键点。

SetTol, GetTol

设置/获取计算误差。这里的计算误差指的是实际输出与用户设置的关键点数目之差占输入曲线上点数目的比例。

ClearKeys

清除已有的关键点,以保证再次计算时不包含上一次计算得到的关键点。

ShrinkNorm

这个函数有四个参数,下面分别介绍:

T dScale:计算得到的关键点与输入曲线上点数目的比例。例如0.1表示关键点占输入点的1/10

T dScaleTol = 0.05:计算误差。

T eTolRight = -1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值