Douglas-Peucker压缩算法
来源:互联网 发布:淘宝按重量标价 编辑:程序博客网 时间:2024/05/22 06:12
Douglas-Peucker算法(道格拉斯-普克算法)是将曲线近似表示为一系列点,并减少点的数量的一种算法。它的优点是具有平移和旋转不变性,给定曲线与阈值后,抽样结果一定。Douglas—Peucker算法通常用于线状矢量数据压缩、轨迹数据压缩等。
算法步骤
- 连接曲线首尾两点A、B形成一条直线AB;
- 计算曲线上离该直线段距离最大的点C,计算其与AB的距离d;
- 比较该距离与预先给定的阈值threshold的大小,如果小于threshold,则以该直线作为曲线的近似,该段曲线处理完毕。
- 如果距离大于阈值,则用点C将曲线分为两段AC和BC,并分别对两段曲线进行步骤[1~3]的处理。
- 当所有曲线都处理完毕后,依次连接各个分割点形成折线,作为原曲线的近似。
实现代码
Java实现代码如下,代码引用自JTS库。
class DouglasPeuckerLineSimplifier { private Coordinate[] pts; private boolean[] usePt; private double distanceTolerance; private LineSegment seg = new LineSegment(); public static Coordinate[] simplify(Coordinate[] pts, double distanceTolerance) { DouglasPeuckerLineSimplifier simp = new DouglasPeuckerLineSimplifier(pts); simp.setDistanceTolerance(distanceTolerance); return simp.simplify(); } public DouglasPeuckerLineSimplifier(Coordinate[] pts) { this.pts = pts; } public void setDistanceTolerance(double distanceTolerance) { this.distanceTolerance = distanceTolerance; } public Coordinate[] simplify() { this.usePt = new boolean[this.pts.length]; for(int i = 0; i < this.pts.length; ++i) { this.usePt[i] = true; } this.simplifySection(0, this.pts.length - 1); CoordinateList coordList = new CoordinateList(); for(int i = 0; i < this.pts.length; ++i) { if(this.usePt[i]) { coordList.add(new Coordinate(this.pts[i])); } } return coordList.toCoordinateArray(); } private void simplifySection(int i, int j) { if(i + 1 != j) { this.seg.p0 = this.pts[i]; this.seg.p1 = this.pts[j]; double maxDistance = -1.0D; int maxIndex = i; int k; for(k = i + 1; k < j; ++k) { double distance = this.seg.distance(this.pts[k]); if(distance > maxDistance) { maxDistance = distance; maxIndex = k; } } if(maxDistance <= this.distanceTolerance) { for(k = i + 1; k < j; ++k) { this.usePt[k] = false; } } else { this.simplifySection(i, maxIndex); this.simplifySection(maxIndex, j); } } }}
阅读全文
0 0
- Douglas-Peucker压缩算法
- Douglas-Peucker算法
- Douglas-Peucker算法
- Douglas-Peucker算法
- 抽稀-Douglas-Peucker算法
- Douglas-Peucker算法理解
- Douglas-Peucker算法
- Douglas-Peucker算法
- 作业:使用Douglas-Peucker算法进行轨迹压缩
- 【独家】加入时间特征的船舶轨迹离线压缩算法——动态Douglas-Peucker算法
- 【独家】加入时间特征的船舶轨迹离线压缩算法——经典Douglas-Peucker算法
- Douglas—Peucker 矢量数据压缩算法
- Douglas-Peucker算法(有代码)
- DP,Douglas-Peucker算法java实现
- 【独家】加入时间特征的船舶轨迹离线压缩算法——快速Douglas-Peucker算法研究
- 求增强型douglas-peucker算法c#源程序代码
- Douglas-Peucker算法的简单实现(JAVA)
- 道格拉斯-普克算法(Douglas–Peucker algorithm)
- application和page对象
- 2017.9.22 模拟考试 解题报告
- erase c++
- PHP实现单一或者多文件上传功能
- python3 函数写文件路径时,怎么写文件路径才正确
- Douglas-Peucker压缩算法
- 文件
- 主见和索引的区别
- Tian Ji -- The Horse Racing
- Spring学习笔记(五) --- 装配Bean之导入和混合配置
- 深度优先搜索从零突破
- FYN OI 奋斗之路8~
- Codeforces Round #435 (Div. 2)
- 【数学分析】BZOJ1041(HAOI2008)[圆上的整点]题解