1、算法原理

道格拉斯普克算法(Douglas-Peukcer)算法是一种简化线状要素的经典算法。先介绍其原始的计算原理:

对每一条曲线的首末点虚连一条直线,求所有点与直线的距离,并找出最大距离值dmax,用dmax与限差D相比。若dmax<D,这条曲线上的中间点全部舍去;若dmax ≥D,保留dmax对应的坐标点,并以该点为界,把曲线分为两部分,对这两部分重复使用该方法。

算法的详细步骤如下:

(1) 在曲线首尾两点间虚连一条直线,求出其余各点到该直线的距离,如图(1)。

(2) 选其最大者与阈值相比较,若大于阈值,则离该直线距离最大的点保留,否则将直线两端点间各点全部舍去,如图(2),第4点保留。

(3) 依据所保留的点,将已知曲线分成两部分处理,重复第1、2步操作,迭代操作,即仍选距离最大者与阈值比较,依次取舍,直到无点可舍去,最后得到满足给定精度限差的曲线点坐标,如图(3)、(4)依次保留第6点、第7点,舍去其他点,即完成线的化简。

2、程序编程思想

可以发现DP算法是一个不断递归的过程,直至不再划分成两部分为止,其类似构建二叉树的过程。首先对输入的一组点,判断其是否需要分裂。

当最大距离大于阈值时,需要进行划分成左右两部分(以4号点断开),如下图所示:

对于每一部分,采用上边类似的思想,判断递归下去,直至不再分成左右两棵树。

3、代码示例:

void BuildTree(DPNode *&root, vector<pcl::PointXYZ> points, pcl::PointXYZ headpoint, pcl::PointXYZ endpoint, double thres_ds)
{arrayoperation ArrExample;//创建一个新的根节点root = new DPNode;root->points = points;root->HeadPoint = headpoint;root->EndPoint = endpoint;if (points.size() <= 2)//点数少于2个的,不再进行划分{root->Left_node = NULL;root->Right_node = NULL;root->NodeType = false;//不能再划分}else{vector<double> disvec;//计算每个点到首尾两点构成直线的距离for (int i = 0; i < points.size(); i++){double tempds = Point2Dline(points[i], headpoint, endpoint);disvec.push_back(tempds);}double maxds = ArrExample.getMax_vector(disvec);double maxindex = ArrExample.GetIndexOfMax(disvec);//若整个点数为10个,那么maxindex一定是介于 2到9之间,因为不可能取首尾两个点,首尾点到直线的距离为0if (maxds < thres_ds)//小于阈值的,不再分割{root->Left_node = NULL;root->Right_node = NULL;root->NodeType = false;//不能再划分}else{root->NodeType = true;//可以继续划分//将点划分成2部分,左边与右边vector<pcl::PointXYZ> Leftpointsvec, Rightpointsvec;for (int i = 0; i < points.size(); i++){if (i <= maxindex){Leftpointsvec.push_back(points[i]);//左边树包含的点}}for (int i = 0; i < points.size(); i++){if (i >= maxindex){Rightpointsvec.push_back(points[i]);//右边树包含的点}}//左边子树的头部点与尾部点pcl::PointXYZ left_headpoint = headpoint;pcl::PointXYZ left_endpoint = points[maxindex];//右边子树的头部点与尾部点pcl::PointXYZ right_headpoint = points[maxindex];pcl::PointXYZ right_endpoint = endpoint;//创建左、右树root->Right_node = new DPNode();BuildTree(root->Left_node, Leftpointsvec, left_headpoint, left_endpoint, thres_ds);BuildTree(root->Right_node, Rightpointsvec, right_headpoint, right_endpoint, thres_ds);}}
}

道格拉斯普克算法(简化线段点)相关推荐

  1. 基于道格拉斯普克算法的轮廓点简化

    道格拉斯普克算法(DP)对元素进行简化,这里介绍对轮廓点进行简化,如下图展示了轮廓点提取.DP保留的关键点.关键点生成的矢量线:  简化点连接生成的多边形 DP简化轮廓点后的关键点  关键点相连生成的 ...

  2. 【图像处理】道格拉斯-普克算法(曲线的折线段逼近)

    目录 一.提要 二.为什么要道格拉斯-普克算法 三.算法描述 四.代码实现 4.1 Python代码1 4.2 python代码2 五.结论 该文的应用见文章:[Halcon算子]get_contou ...

  3. C语言程序实现道格拉斯—普克算法(Douglas--Peucker)

    算法简介 道格拉斯-普克算法(Douglas-Peucker)也称,线简化算法.作用在于,删除冗余数据,减少数据的存贮量,节省存贮空间,加快后继处理的速度. 格拉斯-普克算法(Douglas-Peuc ...

  4. GIS 算法 之 拉默-道格拉斯-普克算法(ramer-douglas-peucker)

    如今的 GIS 应用离不开互联网,即 "WebGIS",GIS 一个显著的特点就是数据量大,数据异构,因此在网络中传输数据成为了影响 WebGIS 应用性能的瓶颈.在 Web 浏览 ...

  5. 170316.道格拉斯-普克算法

    道格拉斯-普克算法 道格拉斯-普克算法 (Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法.迭代适应点算法.分裂与合并算法)是乌尔斯·拉默(Urs Ramer)于19 ...

  6. c++多边形扫描线填充算法_基于MATLAB的道格拉斯普克算法递归实现

    道格拉斯普克算法 (道格拉斯-普克)Douglas-Peukcer算法由D.Douglas和T.Peueker于1973年提出,是线状要素抽稀的经典算法.用它处理大量冗余的几何数据点,既可以达到数据量 ...

  7. opencv 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数

    凸包convexHull.道格拉斯-普克算法Douglas-Peucker algorithm.approxPloyDP 函数 道格拉斯-普克算法(Douglas–Peucker algorithm) ...

  8. GIS编程:利用Arcpy实现道格拉斯-普克算法(核心代码已用类包装,复制粘贴即可用)

    道格拉斯-普克算法是一种通过递归实现折线&多边形抽稀简化的算法,原理很简单,大多数文章都有讲解,这里不多赘述,直接上代码. # -*- coding:utf-8 -*- import arcp ...

  9. 道格拉斯·普克算法 JAVA实现

    道格拉斯·普克算法 JAVA实现 作用: 假如现在有个需求,后端计算出来一条路线规划,路线是由无数个坐标点组成,但是其中大部分连起来都是直线,那直线中有用的点也就起始点和终点,中间的全部点都是可以省略 ...

  10. OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数...

    凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...

最新文章

  1. TX Text Control文字处理教程(13)实现拖放操作
  2. RotateWorldTest对层动作
  3. H3C PPP基本概念
  4. Java面试10大知识点总结宝典助你通关!已拿意向书!
  5. openjudge7624:山区建小学
  6. JAR包使用方法指南
  7. 奇异矩阵能lu分解条件_矩阵的酉不变范数,樊畿控制定理,次可乘性质,p次对称度规函数...
  8. 苹果测试集了成语音识别和人脸识别的智能家居?
  9. asp.net mvc redis同步mysql_Mysql和Redis数据同步策略 - 元思 - 博客园
  10. arc和非arc完美支持
  11. 把ICDAR2019-LSVT原始数据集转为REC任务识别数据
  12. 【GOF】三种工厂模式~
  13. CSDN博客专家认证通过暨我的CSDN成长之路!
  14. 使用000webhost.com免费主机搭建一个WordPress站点
  15. CSDN 双11优惠券 使用攻略,畅享折上折!
  16. 2021衡阳田家炳高考成绩查询,衡阳2021高考最高分多少分,衡阳历年高考状元资料...
  17. 漏洞通告 | Atlassian Confluence存在远程代码执行漏洞,悬镜云鲨RASP天然免疫防护...
  18. handsontable的核心方法
  19. 超级浏览器的技术原理,超级浏览器的浏览器指纹是什么?
  20. matlab小作业答案,MATLAB编程作业答案.doc

热门文章

  1. 如何使用CH340G模块给51单片机下载程序
  2. 权力的游戏第七季/全集Game of Thrones迅雷下载
  3. 查看Win10序列号
  4. 笔记本电脑启动无法打开计算机,笔记本电脑开机没反应(详细教程教您怎么解决)...
  5. 计算机硬件环境指啥,硬件环境指的是什么呢?
  6. 从血红细胞衰老看中老年疑难病和亚健康--
  7. Linux系统中的EOT和EOF
  8. 我们为什么教不好自己的孩子?(云中逸客)
  9. error C2144: syntax error: 'int' should be preceded by ';'
  10. G - Calculation【欧拉公式降幂】