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算法 在数字化过程中,需要对曲线进行采样简化,即在曲线上取有限个点,将其变为折线,并且能够在一定程度 上保持原有的形状。 经典的Douglas-Peucker算法描述如下: (1)在曲线首尾两点A,B之间...
Java编程实现轨迹压缩之Douglas-Peucker算法详细代码 本资源摘要信息提供了Java编程实现轨迹压缩之Douglas-Peucker算法的详细代码,包括问题描述、数据预处理、Douglas-Peucker轨迹压缩算法、点到直线的距离、平均...
使用 Douglas-Peucker 算法的线简化算法。 有关更多信息,请访问维基百科。 该模块分别包含通过DouglasPeucker2D和DouglasPeucker3D实现的 2D 和 3D。 要求: 支持 c++11 的编译器。 这是一个基于模板的模块,...
道格拉斯-普克抽稀算法,java 实现
Ramer-Douglas-Peuker(RDP)算法是一种简化多边形边界的算法,尤其在GIS(地理信息系统)和计算机图形学中广泛应用。它通过去除对整体形状描述影响较小的点,来减少数据点的数量,从而实现数据的压缩和简化。在Java...
道格拉斯-普克(Douglas-Peucker)压缩算法是一种常见的点序列简化算法,用于在保持几何形状基本不变的情况下减少点的数量,常用于地图绘制、CAD系统和计算机图形学等领域。该算法主要目的是降低数据量,提高数据...
开发者可能通过遍历多段线的顶点,应用Douglas-Peucker算法或Ramer-Douglas-Peucker算法等简化策略。此外,项目可能提供了API供其他程序调用,进行多段线的读取、简化和写入。 总结,"cloudinary-1.0.9.zip"和...
其次,将Douglas-Peucker算法与“滑动窗口”算法结合起来以近似轨迹。 第三,根据拐角和预定拐角阈值将轨迹分割成轨迹分割集。 在真实数据集上的实验证明了改进方法的有效性和有效性,获得了良好的噪声过滤和轨迹段...
在这个“shiyan.rar”压缩包中,包含了关于空间分析的一些算法实现,特别是与凸包相关的算法,如道格拉斯-普克算法(Douglas-Peucker Algorithm)、角度限差算法和最小凸包算法。下面我们将详细讨论这些知识点。 1....
道格拉斯-普克(Douglas-Peucker)算法是一种用于简化多边形或曲线,尤其是地理信息系统中的地图线条的算法。这个算法的主要目的是在保持原形状特征的同时,减少数据点的数量,从而降低存储和处理的需求,提高效率。...
道格拉斯-普克算法(Douglas-Peucker Algorithm)是几何图形处理中用于简化多边形或线段序列的一种算法,但在这里,它被巧妙地应用于计算图的最短路径。 在图论中,一个图由节点(顶点)和边组成,边可能带有权重,...
批处理方式包括DP(Douglas-Peucker)算法、TD-TR(Top-Down Time-Ratio)算法和Bellman算法;在线数据压缩方式包括滑动窗口、开放窗口、基于安全区域的方法等。 知识点2:轨迹压缩算法应用场景 轨迹压缩算法的应用...
这时可以考虑使用算法对轨迹点进行简化,如Douglas-Peucker算法。此外,可以开启硬件加速以提高绘图效率。 8. **地图操作**:理解如何使用百度地图API进行地图的缩放、平移和旋转,以便用户能够查看整个轨迹或聚焦...
4. **几何对象的简化**:通过Douglas-Peucker算法等方法,减少几何对象的点数量,降低存储和计算需求。 5. **覆盖分析**:如缓冲区分析,确定某一区域周围的影响范围。 6. **几何对象的投影转换**:支持不同坐标系统...
5. 几何简化与细化:通过Douglas-Peucker算法进行几何对象的简化,同时支持线状几何的细化,以保持关键特征。 三、工作原理 GEOS库基于C++设计,遵循OO(面向对象)原则,使用了SWIG工具生成Python、Java等其他...
最后,为了优化性能,对于大量坐标点的历史轨迹,可以考虑使用聚合算法(如Douglas-Peucker算法)进行简化,减少绘制的点数量,但保持轨迹的基本形状。 总之,使用Android百度地图SDK V3.4绘制历史轨迹涉及到地图...
源代码将包含实现算法的类和方法,可能包括基于不同策略(如Douglas-Peucker算法、Visvalingam-Whyatt算法或其他优化版本)的简化函数。文档可能包含API参考、用户指南和理论背景介绍。示例数据可用于演示算法的使用...
算法可能包括自适应阈值、边缘检测(如Canny算法)和形状简化(如Ramer-Douglas-Peucker算法)等技术。 3. **多线程**:由于图像处理可能会很耗时,为了不阻塞主线程,这个过程应该在后台线程执行。RxJava的`...
同时,对于大量的定位点,可以使用算法优化轨迹点的数量,比如使用Douglas-Peucker算法简化路径。 9. **权限管理**:根据Android的不同版本,我们还需要处理运行时权限的申请,确保应用在用户同意使用位置信息后...
数据简化(reduction)算法,例如Ramer-Douglas-Peucker算法,用于减少轨迹数据中的点数量,同时尽可能保持轨迹的整体形状。这对于处理大规模轨迹数据和优化存储及计算效率至关重要。在轨迹服务器中,可能会在存储...