道格拉斯·普克算法 JAVA实现
道格拉斯·普克算法 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实现相关推荐
- 170316.道格拉斯-普克算法
道格拉斯-普克算法 道格拉斯-普克算法 (Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法.迭代适应点算法.分裂与合并算法)是乌尔斯·拉默(Urs Ramer)于19 ...
- c++多边形扫描线填充算法_基于MATLAB的道格拉斯普克算法递归实现
道格拉斯普克算法 (道格拉斯-普克)Douglas-Peukcer算法由D.Douglas和T.Peueker于1973年提出,是线状要素抽稀的经典算法.用它处理大量冗余的几何数据点,既可以达到数据量 ...
- opencv 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数
凸包convexHull.道格拉斯-普克算法Douglas-Peucker algorithm.approxPloyDP 函数 道格拉斯-普克算法(Douglas–Peucker algorithm) ...
- OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数...
凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...
- 基于道格拉斯普克算法的轮廓点简化
道格拉斯普克算法(DP)对元素进行简化,这里介绍对轮廓点进行简化,如下图展示了轮廓点提取.DP保留的关键点.关键点生成的矢量线: 简化点连接生成的多边形 DP简化轮廓点后的关键点 关键点相连生成的 ...
- 道格拉斯-普克算法(Douglas–Peucker algorithm)
道格拉斯-普克算法(Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法.迭代适应点算法.分裂与合并算法)是将曲线近似表示为一系列点,并减少点的数量的一种算法.该算法的原 ...
- matlab Douglas-Peucker 道格拉斯-普克算法
c道格拉斯-普克算法 [1] (Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法.迭代适应点算法.分裂与合并算法)是将曲线近似表示为一系列点,并减少点的数量的一种算 ...
- 道格拉斯-普克算法(经纬度或坐标点抽稀)
起因 最近在做一个车联网项目,有一个场景是车辆定时上报当前所在经纬度等位置信息上报给平台,平台通过web页面在高德地图上展示车辆行驶路径. 由于车辆上报规则是每隔4s上报一次,一个小时也就是900个点 ...
- 【图像处理】道格拉斯-普克算法(曲线的折线段逼近)
目录 一.提要 二.为什么要道格拉斯-普克算法 三.算法描述 四.代码实现 4.1 Python代码1 4.2 python代码2 五.结论 该文的应用见文章:[Halcon算子]get_contou ...
最新文章
- 应用进退法确定一维搜索区间_NMR-如何确定官能团含量(MestReC)
- Java Eclipse进行断点调试
- 【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行...
- python方格染色_判定二部图的着色算法(Python),题,染色法,判断,二分
- JS 新建web sql 数据表
- 树莓派安装python3.5_梦见树_周公解梦梦到树是什么意思_做梦梦见树好不好_周公解梦官网...
- LeetCode 81 搜索旋转排序数组 II
- thinkphp漏洞_漏洞分析之thinkPHP反序列化:这就是黑客的世界吗
- .Net WinForm 启用XP效果的问题
- sqlyong导出sql没有数据_sqlyog怎么导入外部数据库-sqlyog导入数据库的方法 - 河东软件园...
- mysql5.6.22编译安装教程_Linux CentOS6.0下编译安装MySQL 5.6.22
- [java]内部类的总结
- 生成base64二维码带logo
- matlab需要什么运行库,运行库是什么?常用软件运行库都有哪些?
- # Scroll 系列
- firefox浏览器linuxwin10安装,数据互通,firefox国际版
- 证明“我是我”是一个怎样的过程?
- My findings:CoordConv坐标嵌入技术及其泛化性能
- 王垠:对 Rust 语言的分析
- javascript中用三元运算符实现手动图片转换
热门文章
- PPU (power policy unit)
- [Spring] spring-session + JedisPool 实现 session 共享
- 特斯拉的降价,习惯就好
- 小鲲Python嘎嘎炫~day3
- 计算机cad模板样例,[计算机软件及应用]cad实例.doc
- U盘装linux总是不行,U盘安装Linux安装报错及解决方案
- 逻辑为基、数企赋能(NO.3)-逻辑定律
- 分布式缓存架构(3)-Redis事务主从复制哨兵机制
- 时间序列分析个人学习笔记2
- [HG5143D]电信光猫3.0网关折腾笔记