Ramer-Douglas-Peuker

Javascript Implementation Of The Ramer-Douglas-Peuker Algorithm author(s): Chris Mihalcik

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/jqPlot/1.0.8/jquery.jqplot.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqPlot/1.0.8/jquery.jqplot.min.css">
<div id="chartdiv" style="height:400px;width:300px; "></div>

JavaScript

var series2_1 = [
    [2,2],
    [2.5,2.5],
    [3,3],
    [3.5,3.5],
    [4,4],
    [4.5,3.5],
    [5,3],
    [5.5,2.5],
    [6,2]];

var series2_0 = [
    [2,2],
    [2,2.5],
    [3,3],
    [3.5,3.5],
    [4,4],
    [4.5,3.5],
    [5,3],
    [7,2.75],
    [6,2]];

var series2_0_simplified_0_25 = simplify(series2_0, 0.25);
var series2_0_simplified_1 = simplify(series2_0, 1);
var series2_0_simplified_1_75 = simplify(series2_0, 1.75);

var data1 = [series2_0, series2_0_simplified_0_25, series2_0_simplified_1, series2_0_simplified_1_75];

var jqp = $.jqplot('chartdiv',data1, {animate: false, sortData: false});

function distanceFromALine(point, line) {
    var x0 = point[0],
        y0 = point[1],
        indexOfLastPoint = line.length-1,
        x1 = line[0][0],
        y1 = line[0][1],
        x2 = line[indexOfLastPoint][0],
        y2 = line[indexOfLastPoint][1];
    //console.log('distance from a line', x0, y0, x1, y1, x2, y2)
    var numerator = Math.abs( ((y2-y1)*x0) - ((x2-x1)*y0) + (x2*y1) - (y2*x1) );
    var denominator = Math.sqrt( Math.pow((y2-y1),2) + Math.pow((x2-x1),2) );
    return numerator / denominator;
}
//test
//console.log(distanceFromALine([4, 4], [[2, 2], [6, 2]]))
//console.log(distanceFromALine([2.5, 2.5], [[2, 2], [6, 2]]))

function farthestPoint(line) {
    var candidates = line.slice(1,-1);
    var farthest = candidates.reduce( function(p,c, i) {
        //console.log("p: " + p);
        //console.log("c: " + c)
        var distance = distanceFromALine(c, line);
        //console.log("d: " + distance);
        
        if (p.distance > distance) {
            return p;
        } else {
            return {index: i, distance: distance};
        }
        
    }, {index: undefined, distance: 0});
    
    //console.log('f: ', farthest)
    return farthest;
}
//console.log(farthestPoint(series2_0))

function simplify(line, tollerance) {
    //console.log('line: ', JSON.stringify(line))
    if (line.length <= 2) {
        return line;
   ...