Java Program for Douglas-Peucker Algorithm Implementation

This is a Java Program to implement Douglas-Peucker Algorithm. The Ramer–Douglas–Peucker algorithm (RDP) is an algorithm for reducing the number of points in a curve that is approximated by a series of points. This algorithm is also known under the names Douglas–Peucker algorithm, iterative end-point fit algorithm and split-and-merge algorithm. The purpose of the algorithm is, given a curve composed of line segments, to find a similar curve with fewer points. The algorithm defines ‘dissimilar’ based on the maximum distance between the original curve and the simplified curve. The simplified curve consists of a subset of the points that defined the original curve.

Here is the source code of the Java Program for Douglas-Peucker Algorithm Implementation. The Java program is successfully compiled and run on a Windows system. The program output is also shown below.

//This is a java program to filter out points using Douglas Peucker Algorithm
import static java.lang.Math.abs;
import static java.lang.Math.pow;
import static java.lang.Math.sqrt;
 
import java.util.Random;
 
class RamerDouglasPeuckerFilter
{
 
    private double epsilon;
 
    public RamerDouglasPeuckerFilter(double epsilon)
    {
        if (epsilon <= 0)
        {
            throw new IllegalArgumentException("Epsilon nust be > 0");
        }
        this.epsilon = epsilon;
    }
 
    public double[] filter(double[] data)
    {
        return ramerDouglasPeuckerFunction(data, 0, data.length - 1);
    }
 
    public double getEpsilon()
    {
        return epsilon;
    }
 
    protected double[] ramerDouglasPeuckerFunction(double[] points,
            int startIndex, int endIndex)
    {
        double dmax = 0;
        int idx = 0;
        double a = endIndex - startIndex;
        double b = points[endIndex] - points[startIndex];
        double c = -(b * startIndex - a * points[startIndex]);
        double norm = sqrt(pow(a, 2) + pow(b, 2));
        for (int i = startIndex + 1; i < endIndex; i++)
        {
            double distance = abs(b * i - a * points[i] + c) / norm;
            if (distance > dmax)
            {
                idx = i;
                dmax = distance;
            }
        }
        if (dmax >= epsilon)
        {
            double[] recursiveResult1 = ramerDouglasPeuckerFunction(points,
                    startIndex, idx);
            double[] recursiveResult2 = ramerDouglasPeuckerFunction(points,
                    idx, endIndex);
            double[] result = new double[(recursiveResult1.length - 1)
                    + recursiveResult2.length];
            System.arraycopy(recursiveResult1, 0, result, 0,
                    recursiveResult1.length - 1);
            System.arraycopy(recursiveResult2, 0, result,
                    recursiveResult1.length - 1, recursiveResult2.length);
            return result;
        } else
        {
            return new double[] { points[startIndex], points[endIndex] };
        }
    }
 
    public void setEpsilon(double epsilon)
    {
        if (epsilon <= 0)
        {
            throw new IllegalArgumentException("Epsilon nust be > 0");
        }
        this.epsilon = epsilon;
    }
 
}
 
public class Douglas_Peucker_Algorithm
{
    public static void main(String args[])
    {
        Random random = new Random();
        double[] points = new double[20];
        double[] fpoints;
        for (int i = 0; i < points.length; i++)
            points[i] = random.nextInt(10);
        RamerDouglasPeuckerFilter rdpf = new RamerDouglasPeuckerFilter(1);
        fpoints = rdpf.filter(points);
 
        System.out.println("Orginal points");
        for (int i = 0; i < points.length; i++)
            System.out.print(points[i] + " ");
 
        System.out.println("\nFiltered points");
        for (int i = 0; i < fpoints.length; i++)
            System.out.print(fpoints[i] + " ");       
    }
}

Output:

$ javac Douglas_Peucker_Algorithm.java
$ java Douglas_Peucker_Algorithm
 
Orginal points
5.0 0.0 8.0 7.0 2.0 9.0 4.0 4.0 0.0 7.0 4.0 1.0 9.0 6.0 8.0 9.0 6.0 6.0 9.0 6.0 
Filtered points
5.0 0.0 8.0 2.0 9.0 0.0 7.0 1.0 9.0 6.0 9.0 6.0 9.0 6.0

Related posts:

Java Program to Check Whether an Input Binary Tree is the Sub Tree of the Binary Tree
Registration with Spring Security – Password Encoding
Spring Data Reactive Repositories with MongoDB
Spring Boot - Runners
Handle EML file with JavaMail
Java Program to Find the Minimum Element of a Rotated Sorted Array using Binary Search approach
Guide to the Java Clock Class
Java Program to Check if a Given Set of Three Points Lie on a Single Line or Not
Concurrent Test Execution in Spring 5
Registration – Password Strength and Rules
Java Program to Solve Set Cover Problem assuming at max 2 Elements in a Subset
Java Program to Implement First Fit Decreasing for 1-D Objects and M Bins
Java Program to Implement Hopcroft Algorithm
Use Liquibase to Safely Evolve Your Database Schema
Array to String Conversions
Java Program to Compute the Volume of a Tetrahedron Using Determinants
Java Program to Solve Travelling Salesman Problem for Unweighted Graph
Java Program to Find a Good Feedback Edge Set in a Graph
Một số tính năng mới về xử lý ngoại lệ trong Java 7
Mix plain text and HTML content in a mail
Java Program to implement Priority Queue
A Guide to Concurrent Queues in Java
Java Program to Implement Slicker Algorithm that avoids Triangulation to Find Area of a Polygon
Recommended Package Structure of a Spring Boot Project
Auditing with JPA, Hibernate, and Spring Data JPA
Converting Between Byte Arrays and Hexadecimal Strings in Java
Tính đóng gói (Encapsulation) trong java
Comparing getPath(), getAbsolutePath(), and getCanonicalPath() in Java
Introduction to Spring Data REST
Getting Started with Forms in Spring MVC
Java Program to Implement Gauss Jordan Elimination
Notify User of Login From New Device or Location