当前位置: 首页 > article >正文

地理空间-Java实现航迹稀释

Java实现航迹点稀释算法(Douglas - Peucker算法)的示例代码,该算法可在保证航迹整体形状变化不大的情况下减少航迹点数量:


import java.util.ArrayList;

import java.util.List;

 

class Point {

    double x;

    double y;

 

    public Point(double x, double y) {

        this.x = x;

        this.y = y;

    }

}

 

public class TrackThinning {

 

    public static List<Point> douglasPeucker(List<Point> points, double epsilon) {

        if (points.size() < 3) {

            return points;

        }

 

        int index = -1;

        double dmax = 0;

        int end = points.size();

        for (int i = 1; i < end - 1; i++) {

            double d = perpendicularDistance(points.get(i), points.get(0), points.get(end - 1));

            if (d > dmax) {

                index = i;

                dmax = d;

            }

        }

 

        List<Point> result = new ArrayList<>();

        if (dmax > epsilon) {

            List<Point> recursiveResult1 = douglasPeucker(points.subList(0, index + 1), epsilon);

            List<Point> recursiveResult2 = douglasPeucker(points.subList(index, points.size()), epsilon);

 

            result.addAll(recursiveResult1.subList(0, recursiveResult1.size() - 1));

            result.addAll(recursiveResult2);

        } else {

            result.add(points.get(0));

            result.add(points.get(points.size() - 1));

        }

 

        return result;

    }

 

    private static double perpendicularDistance(Point point, Point start, Point end) {

        double dx = end.x - start.x;

        double dy = end.y - start.y;

        double numerator = Math.abs((dy * point.x - dx * point.y) + (end.x * start.y - end.y * start.x));

        double denominator = Math.sqrt(dy * dy + dx * dx);

        return numerator / denominator;

    }

 

    public static void main(String[] args) {

        List<Point> points = new ArrayList<>();

        points.add(new Point(0, 0));

        points.add(new Point(1, 1));

        points.add(new Point(2, 2));

        points.add(new Point(3, 2));

        points.add(new Point(4, 3));

        points.add(new Point(5, 4));

 

        double epsilon = 0.5;

        List<Point> thinnedPoints = douglasPeucker(points, epsilon);

 

        for (Point p : thinnedPoints) {

            System.out.println("(" + p.x + ", " + p.y + ")");

        }

    }

}

 

 


http://www.kler.cn/a/384443.html

相关文章:

  • langchain 4大组件 | AI应用开发
  • C语言复习第7章 自定义类型(结构体+位段+枚举+联合体)
  • 关于诊断中的各种时间参数
  • 【前端知识】es6基础语法介绍
  • Windows Server2012 R2搭建NFS服务器
  • 【青牛科技】GC8549替代LV8549/ONSEMI在摇头机、舞台灯、打印机和白色家电等产品上的应用分析
  • 【北京迅为】《STM32MP157开发板嵌入式开发指南》-第七十二章 Debian文件系统
  • Java反射原理及其性能优化
  • C#实战:使用腾讯云识别服务轻松提取火车票信息
  • 科研绘图系列:R语言组合连线图和箱线图(linechart+boxplot)
  • Vue实战学习(2)(Vue快速入门(快速构建一个局部Vue项目))
  • xftp连接中不成功 + sudo vim 修改sshd_config不成功的解决方法
  • 斗破QT编程入门系列之二:GUI应用程序设计基础:UI文件(四星斗师)
  • 【C++】哈希表封装 unordered_map 和 unordered_set 的实现过程
  • 信息安全工程师(80)网络安全测评技术与工具
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-31
  • (十)JavaWeb后端开发——SpringBoot
  • 纯血鸿蒙Native层支持说明
  • 为什么 Allow 配合 meta noindex 比使用Disallow好?
  • 免费数据集网站
  • 如何下载无水印的TikTok视频
  • Linux下的ADC
  • 若依入门案例
  • mysql tar.gz包安装
  • 玩转HF/魔搭/魔乐社区(作业)
  • AFL++实战入门与afl-fuzz流程解析(源码流程图)