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

作用:

假如现在有个需求,后端计算出来一条路线规划,路线是由无数个坐标点组成,但是其中大部分连起来都是直线,那直线中有用的点也就起始点和终点,中间的全部点都是可以省略的。

原理:

对一条路径的起点和终点做一条直线,计算其余全部点到直线的距离,并找出最大距离,若最大距离比阈值小,则去掉全部中间点,若距离比阈值大,则保留当前点,以当前点为界,分成左右两条路径,重复前面的过程,直到所有的距离都小于阈值,就完事了,所以阈值越大,点越稀少,阈值越小,路径越接近真实的。

1、坐标点实体

package com.pet.utils;import lombok.AllArgsConstructor;
import lombok.Data;@Data
@AllArgsConstructor
class Coordinate {private double x;private double y;
}

2、抽稀

阈值应大于等于1,阈值越大,路径越简单,阈值越小,路径越全。

package com.pet.utils;import java.util.ArrayList;
import java.util.List;public class DouglasUtil {public static void main(String[] args) {List<Coordinate> points = new ArrayList<>();points.add(new Coordinate(1, 2));points.add(new Coordinate(2, 2));points.add(new Coordinate(3, 4));points.add(new Coordinate(4, -5));points.add(new Coordinate(5, 3));points.add(new Coordinate(6, 3));points.add(new Coordinate(7, 5));points.add(new Coordinate(8, 2));points.add(new Coordinate(9, 0));points.add(new Coordinate(10, 9));points.add(new Coordinate(11, 5));for (Coordinate p : douglas(points, 1)) {System.out.print("(" + p.getX() + "," + p.getY() + ") ");}}private static List<Coordinate> douglas(List<Coordinate> points, int threshold) {List<Coordinate> result = new ArrayList<>();// 找到最大阈值点double maxH = 0;int index = 0;int end = points.size();for (int i = 1; i < end - 1; i++) {// 计算点到起点和终点组成线段的高double h = getDistance(points.get(i), points.get(0), points.get(end - 1));if (h > maxH) {maxH = h;index = i;}}// 如果存在最大阈值点,就进行递归遍历出所有最大阈值点return getCoordinates(points, threshold, maxH, index, end, result);}private static List<Coordinate> getCoordinates(List<Coordinate> points, int epsilon, double maxH, int index, int end, List<Coordinate> result) {if (maxH > epsilon) {List<Coordinate> leftPoints = new ArrayList<>();List<Coordinate> rightPoints = new ArrayList<>();// 分成两半 继续找比阈值大的for (int i = 0; i < end; i++) {if (i < index) {leftPoints.add(points.get(i));} else {rightPoints.add(points.get(i));}}List<Coordinate> leftResult = douglas(leftPoints, epsilon);List<Coordinate> rightResult = douglas(rightPoints, epsilon);rightResult.remove(0);leftResult.addAll(rightResult);result = leftResult;} else {result.add(points.get(0));result.add(points.get(end - 1));}return result;}/*** 计算点到直线的距离*/private static double getDistance(Coordinate p, Coordinate s, Coordinate e) {double AB = distance(s, e);double CB = distance(p, s);double CA = distance(p, e);// 三角形面积double S = helen(CB, CA, AB);// 三角形面积 = AB(底) * 高 / 2// 所以 高 = 2 * 三角形面积 / AB(底)return 2 * S / AB;}/*** 计算两点之间的距离*/private static double distance(Coordinate p1, Coordinate p2) {double x1 = p1.getX();double y1 = p1.getY();double x2 = p2.getX();double y2 = p2.getY();return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));}/*** 三角形面积*/private static double helen(double CB, double CA, double AB) {double p = (CB + CA + AB) / 2;return Math.sqrt(p * (p - CB) * (p - CA) * (p - AB));}
}

道格拉斯·普克算法 JAVA实现相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 道格拉斯-普克算法(Douglas–Peucker algorithm)

    道格拉斯-普克算法(Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法.迭代适应点算法.分裂与合并算法)是将曲线近似表示为一系列点,并减少点的数量的一种算法.该算法的原 ...

  7. matlab Douglas-Peucker 道格拉斯-普克算法

    c道格拉斯-普克算法 [1]  (Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法.迭代适应点算法.分裂与合并算法)是将曲线近似表示为一系列点,并减少点的数量的一种算 ...

  8. 道格拉斯-普克算法(经纬度或坐标点抽稀)

    起因 最近在做一个车联网项目,有一个场景是车辆定时上报当前所在经纬度等位置信息上报给平台,平台通过web页面在高德地图上展示车辆行驶路径. 由于车辆上报规则是每隔4s上报一次,一个小时也就是900个点 ...

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

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

最新文章

  1. 应用进退法确定一维搜索区间_NMR-如何确定官能团含量(MestReC)
  2. Java Eclipse进行断点调试
  3. 【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行...
  4. python方格染色_判定二部图的着色算法(Python),题,染色法,判断,二分
  5. JS 新建web sql 数据表
  6. 树莓派安装python3.5_梦见树_周公解梦梦到树是什么意思_做梦梦见树好不好_周公解梦官网...
  7. LeetCode 81 搜索旋转排序数组 II
  8. thinkphp漏洞_漏洞分析之thinkPHP反序列化:这就是黑客的世界吗
  9. .Net WinForm 启用XP效果的问题
  10. sqlyong导出sql没有数据_sqlyog怎么导入外部数据库-sqlyog导入数据库的方法 - 河东软件园...
  11. mysql5.6.22编译安装教程_Linux CentOS6.0下编译安装MySQL 5.6.22
  12. [java]内部类的总结
  13. 生成base64二维码带logo
  14. matlab需要什么运行库,运行库是什么?常用软件运行库都有哪些?
  15. # Scroll 系列
  16. firefox浏览器linuxwin10安装,数据互通,firefox国际版
  17. 证明“我是我”是一个怎样的过程?
  18. My findings:CoordConv坐标嵌入技术及其泛化性能
  19. 王垠:对 Rust 语言的分析
  20. javascript中用三元运算符实现手动图片转换

热门文章

  1. PPU (power policy unit)
  2. [Spring] spring-session + JedisPool 实现 session 共享
  3. 特斯拉的降价,习惯就好
  4. 小鲲Python嘎嘎炫~day3
  5. 计算机cad模板样例,[计算机软件及应用]cad实例.doc
  6. U盘装linux总是不行,U盘安装Linux安装报错及解决方案
  7. 逻辑为基、数企赋能(NO.3)-逻辑定律
  8. 分布式缓存架构(3)-Redis事务主从复制哨兵机制
  9. 时间序列分析个人学习笔记2
  10. [HG5143D]电信光猫3.0网关折腾笔记