`
hnjzsyjyj
  • 浏览: 28834 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Douglas-Peucker算法的JAVA实现

阅读更多
import java.awt.*;   
import java.util.Random;   
import javax.swing.JFrame;   
  
/**  
 * @author Weih  
 * @date Oct 13, 2010  
 */  
public class PolyCompress extends JFrame {   
       
    private static final int NUMBER = 50;// 原始曲线节点数   
    private static final int TOLERANCE = 10;// 压缩时的距离阀值   
    private int[] source_x = new int[NUMBER];// 原始曲线节点的横坐标   
    private int[] source_y = new int[NUMBER];// 原始曲线节点的纵坐标   
    private int[] result_x;// 存储压缩后的曲线节点横坐标   
    private int[] result_y;// 存储压缩后的曲线节点纵坐标   
    private int[] index = new int[NUMBER];// 记录保留的节点在原始曲线节点坐标数组中的位置   
    private int count = 0;// 保留的节点个数   
  
    private int width, height;   
  
    public PolyCompress() {   
        setSize(400, 300);   
        setBackground(Color.white);   
        Dimension srcSize = Toolkit.getDefaultToolkit().getScreenSize();   
        width = getWidth();   
        height = getHeight();   
        setLocation((srcSize.width - width) / 2, (srcSize.height - height) / 2);   
        setVisible(true);   
  
        Random random = new Random();   
        source_x[0] = 50;   
        source_y[0] = 100;   
        for (int i = 1; i < NUMBER; i++) {   
            source_x[i] = source_x[i - 1] + random.nextInt(10);   
            source_y[i] = 75 + random.nextInt(50);   
        }   
  
        System.out.println("原始数据点:");   
        for (int i = 0; i < NUMBER; i++) {   
            System.out.println("source_xy[" + i + "]:" + source_x[i] + ","  
                    + source_y[i]);   
        }   
        // 将原始曲线的首尾节点保留下来。   
        index[count++] = 0;   
        index[count++] = NUMBER - 1;   
  
        // 调用递归函数   
        compress(0, NUMBER - 1);   
  
        sort();   
  
        result_x = new int[count];   
        result_y = new int[count];   
  
        for (int i = 0; i < count; i++) {   
            result_x[i] = source_x[index[i]];   
            result_y[i] = source_y[index[i]];   
        }   
  
        System.out.println("原曲线中节点数为:" + NUMBER);   
        System.out.println("节点取舍的阈值为:" + TOLERANCE);   
        System.out.println("压缩后的曲线中节点数为:" + count);   
        System.out.println("保留节点在原曲线节点数据中的位置如下:");   
        System.out.println("本次压缩比为:" + 100 * count / NUMBER + "%");   
  
    }   
  
    public double distance(int start, int end, int current) {   
  
        double a = (double) (source_y[end] - source_y[start]);   
        double b = (double) (source_x[end] - source_x[start]);   
        double c = (double) (source_y[end] - source_y[start])   
                - (double) (source_x[end] - source_x[start]);   
  
        double dist = Math.abs(a * source_x[current] + b * source_y[current]   
                + c)   
                / Math.sqrt(a * a + b * b);   
        return dist;   
    }   
  
    @Override  
    public void paint(Graphics g) {   
        super.paint(g);   
        // 绘制原始曲线   
        g.setColor(Color.gray);   
        g.drawLine(0, 100, width, 100);   
        g.setColor(Color.red);   
        g.drawPolyline(source_x, source_y, NUMBER);   
  
        // 如果压缩后节点数不为0,则绘制压缩后的曲线   
        if (count != 0) {   
            g.setColor(Color.gray);   
            g.drawLine(0, 200, width, 200);   
            g.setColor(Color.green);   
            g.drawPolyline(result_x, result_y, count);   
        }   
    }   
  
    public void sort() {   
        for (int i = 0; i < count; i++) {   
            for (int j = i + 1; j < count; j++) {   
                if (index[j] < index[i]) {   
                    int temp = index[j];   
                    index[j] = index[i];   
                    index[i] = temp;   
                }   
            }   
        }   
    }   
  
    public void compress(int i, int j) {   
        double temp_dist;   
        double max = 0;   
        int temp_p = 0;   
  
        for (int k = i + 1; k < j; k++) {   
            temp_dist = distance(i, j, k);   
            if (max < temp_dist) {   
                max = temp_dist;   
                temp_p = k;   
            }   
        }   
  
        if (max > TOLERANCE) {   
            index[count++] = temp_p;   
            compress(i, temp_p);   
            compress(temp_p, j);   
        }   
    }   
  
    public static void main(String[] args) {   
        PolyCompress pc = new PolyCompress();   
    }   
}  


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/no_cross_no_crown/archive/2010/10/13/5938818.aspx
分享到:
评论

相关推荐

    Douglas-Peucker算法 算法的Java实现

    Douglas-Peucker算法 在数字化过程中,需要对曲线进行采样简化,即在曲线上取有限个点,将其变为折线,并且能够在一定程度 上保持原有的形状。 经典的Douglas-Peucker算法描述如下: (1)在曲线首尾两点A,B之间...

    Java编程实现轨迹压缩之Douglas-Peucker算法详细代码

    Java编程实现轨迹压缩之Douglas-Peucker算法详细代码 本资源摘要信息提供了Java编程实现轨迹压缩之Douglas-Peucker算法的详细代码,包括问题描述、数据预处理、Douglas-Peucker轨迹压缩算法、点到直线的距离、平均...

    LineSimplification:使用 Douglas-Peucker 算法的线简化算法

    使用 Douglas-Peucker 算法的线简化算法。 有关更多信息,请访问维基百科。 该模块分别包含通过DouglasPeucker2D和DouglasPeucker3D实现的 2D 和 3D。 要求: 支持 c++11 的编译器。 这是一个基于模板的模块,...

    道格拉斯-普克抽稀算法,java 实现

    道格拉斯-普克抽稀算法,java 实现

    rdp-js:Ramer-Douglas-Peuker算法的Java语言实现

    Ramer-Douglas-Peuker(RDP)算法是一种简化多边形边界的算法,尤其在GIS(地理信息系统)和计算机图形学中广泛应用。它通过去除对整体形状描述影响较小的点,来减少数据点的数量,从而实现数据的压缩和简化。在Java...

    用Java实现的道格拉斯-普克压缩算法

    道格拉斯-普克(Douglas-Peucker)压缩算法是一种常见的点序列简化算法,用于在保持几何形状基本不变的情况下减少点的数量,常用于地图绘制、CAD系统和计算机图形学等领域。该算法主要目的是降低数据量,提高数据...

    cloudinary-1.0.9.zip

    开发者可能通过遍历多段线的顶点,应用Douglas-Peucker算法或Ramer-Douglas-Peucker算法等简化策略。此外,项目可能提供了API供其他程序调用,进行多段线的读取、简化和写入。 总结,"cloudinary-1.0.9.zip"和...

    GPS数据的噪声过滤,轨迹压缩和轨迹分割

    其次,将Douglas-Peucker算法与“滑动窗口”算法结合起来以近似轨迹。 第三,根据拐角和预定拐角阈值将轨迹分割成轨迹分割集。 在真实数据集上的实验证明了改进方法的有效性和有效性,获得了良好的噪声过滤和轨迹段...

    shiyan.rar_空间分析 凸包

    在这个“shiyan.rar”压缩包中,包含了关于空间分析的一些算法实现,特别是与凸包相关的算法,如道格拉斯-普克算法(Douglas-Peucker Algorithm)、角度限差算法和最小凸包算法。下面我们将详细讨论这些知识点。 1....

    DP.rar_DP道格拉斯_线 化简_道格拉斯_道格拉斯-普克_道格拉斯普克

    道格拉斯-普克(Douglas-Peucker)算法是一种用于简化多边形或曲线,尤其是地理信息系统中的地图线条的算法。这个算法的主要目的是在保持原形状特征的同时,减少数据点的数量,从而降低存储和处理的需求,提高效率。...

    最短路径分析

    道格拉斯-普克算法(Douglas-Peucker Algorithm)是几何图形处理中用于简化多边形或线段序列的一种算法,但在这里,它被巧妙地应用于计算图的最短路径。 在图论中,一个图由节点(顶点)和边组成,边可能带有权重,...

    Java编程实现轨迹压缩算法开放窗口实例代码

    批处理方式包括DP(Douglas-Peucker)算法、TD-TR(Top-Down Time-Ratio)算法和Bellman算法;在线数据压缩方式包括滑动窗口、开放窗口、基于安全区域的方法等。 知识点2:轨迹压缩算法应用场景 轨迹压缩算法的应用...

    Android百度地图画运动轨迹和GPS定位

    这时可以考虑使用算法对轨迹点进行简化,如Douglas-Peucker算法。此外,可以开启硬件加速以提高绘图效率。 8. **地图操作**:理解如何使用百度地图API进行地图的缩放、平移和旋转,以便用户能够查看整个轨迹或聚焦...

    经典JTS中文开发资料

    4. **几何对象的简化**:通过Douglas-Peucker算法等方法,减少几何对象的点数量,降低存储和计算需求。 5. **覆盖分析**:如缓冲区分析,确定某一区域周围的影响范围。 6. **几何对象的投影转换**:支持不同坐标系统...

    geos库geos库geos库

    5. 几何简化与细化:通过Douglas-Peucker算法进行几何对象的简化,同时支持线状几何的细化,以保持关键特征。 三、工作原理 GEOS库基于C++设计,遵循OO(面向对象)原则,使用了SWIG工具生成Python、Java等其他...

    android 百度地图sdk v3.4 绘制历史轨迹

    最后,为了优化性能,对于大量坐标点的历史轨迹,可以考虑使用聚合算法(如Douglas-Peucker算法)进行简化,减少绘制的点数量,但保持轨迹的基本形状。 总之,使用Android百度地图SDK V3.4绘制历史轨迹涉及到地图...

    137-simplification:时空轨迹简化算法

    源代码将包含实现算法的类和方法,可能包括基于不同策略(如Douglas-Peucker算法、Visvalingam-Whyatt算法或其他优化版本)的简化函数。文档可能包含API参考、用户指南和理论背景介绍。示例数据可用于演示算法的使用...

    Android-一个基于Rxjava的Android库用于将图像转换为lowpoly

    算法可能包括自适应阈值、边缘检测(如Canny算法)和形状简化(如Ramer-Douglas-Peucker算法)等技术。 3. **多线程**:由于图像处理可能会很耗时,为了不阻塞主线程,这个过程应该在后台线程执行。RxJava的`...

    百度地图轨迹划线 轨迹跟踪 跑步Demo

    同时,对于大量的定位点,可以使用算法优化轨迹点的数量,比如使用Douglas-Peucker算法简化路径。 9. **权限管理**:根据Android的不同版本,我们还需要处理运行时权限的申请,确保应用在用户同意使用位置信息后...

    轨迹服务器

    数据简化(reduction)算法,例如Ramer-Douglas-Peucker算法,用于减少轨迹数据中的点数量,同时尽可能保持轨迹的整体形状。这对于处理大规模轨迹数据和优化存储及计算效率至关重要。在轨迹服务器中,可能会在存储...

Global site tag (gtag.js) - Google Analytics