简介
Douglas-Peucker算法[1]用于曲线点的抽稀。一个典型的应用是对地图数据进行压缩,在不损失原数据所表现出的形状的基础上,使用尽可能少的数据。John Hershberger和Jack Snoeyink给出了C语言的实现[2],然而该算法在做坏情况下的计算复杂度为 。Jonathan de Halleux 给出了基于路径凸壳递归方法的C++实现DPApprox[3]。Elmar de Koning也给出了自己的实现方案psimpl[4]。本文只从工程的角度介绍如何使用后面两个软件包,而不是从科研角度讲解DP抽稀算法的原理和程序实现的细节。
DPApprox的程序结构设计和使用
为了增强可扩展性,DPApprox软件包使用了C++模板,这样用户可以使用任意数据类型(整数型、浮点型、双精度浮点型等)表示曲线上的点坐标值。曲线上的点用类TPoint描述。整条输入曲线(即曲线上的所有点)用类PointContainer表示,输出的关键点用类KeyContainer表示。PointContainer和KeyContainer都提供了类似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 |