Line simplification algorithm utilizing Douglas-Peucker algorithm.
For more info, visit the wikipedia entry.
This module contains implementation for both 2D and 3D via DouglasPeucker2D
and DouglasPeucker3D
respectively.
A compiler with c++11 support. This is a template based module, thus you can't really compile it.
That's it!
To be able to do anything, first clone this repository. Copy the DouglasPeucker.h
from include/
directory to your own, and your done. The src
is just a code snippet for helping me debug, so don't bother with that.
2D example:
#include <list>
#include "DouglasPeucker.h"
std::list<p2d> line; // Contains coordinate.
DouglasPuecker2D<p2d, p2dAccessor> dp2d(line);
dp2d.simplify(0.1F);
std::list<p2d> result = dp2d.getLine();
3D example:
#include <list>
#include "DouglasPeucker.h"
std::list<p3d> line; // Contains coordinate.
DouglasPuecker3D<p3d, p3dAccessor> dp3d(line);
dp3d.simplify(0.1F);
std::list<p3d> result = dp3d.getLine();
Note that p2d
and p3d
are just tuple<double, double>
and tuple<double, double, double>
respectively.
If you have your own 2D class/struct, with getX
and getY
method is defined then:
#include <list>
#include "DouglasPeucker.h"
struct Point2D{
double x, y;
double getX() const { return x; }
double getY() const { return y; }
};
std::list<Point2D> line; // Contains coordinate.
DouglasPuecker2D<Point2D> dp2d(line);
dp2d.simplify(0.1F);
std::list<Point2D> result = dp2d.getLine();
If getX
and getY
method is not defined in your 2D class/struct, create an accessor class:
#include <list>
#include "DouglasPeucker.h"
struct Point2D{
double x, y;
};
// Required if methods not defined.
struct Point2DAccessor{
static double getX(const Point2D& p) { return p.x; }
static double getY(const Point2D& p) { return p.y; }
};
std::list<Point2D> line; // Contains coordinate.
DouglasPuecker2D<Point2D, Point2DAccessor> dp2d(line);
dp2d.simplify(0.1F);
std::list<Point2D> result = dp2d.getLine();
Same applies for custom 3D data types.
If you are stuck and need help, feel free to contact me at jandres@ualberta.ca. I'm always glad to help.