psimpl - generic n-dimensional polyline simplification
Copyright (C) 2010-2011 Elmar de Koning, edekoning@gmail.com
--------------------------------------------------------------------------------
28-09-2010 - Initial version
23-10-2010 - Changed license from CPOL to MPL
26-10-2010 - Clarified input (type) requirements, and changed the
behavior of the algorithms under invalid input.
01-12-2010 - Added the nth point, perpendicular distance and Reumann-Witkam
routines; moved all functions related to distance calculations to
the math namespace
10-12-2010 - Fixed a bug in the perpendicular distance routine
27-02-2011 - Added Opheim simplification, and functions for computing positional
errors due to simplification; renamed simplify_douglas_peucker_alt
to simplify_douglas_peucker_n
18-06-2011 Added Lang simplification; fixed divide by zero bug when using
integers; fixed a bug where incorrect output iterators were
returned under invalid input; fixed a bug in douglas_peucker_n
where an incorrect number of points could be returned; fixed a bug
in compute_positional_errors2 that required the output and input
iterator types to be the same; fixed a bug in
compute_positional_error_statistics where invalid statistics could
be returned under questionable input; documented input iterator
requirements for each algorithm; miscellaneous refactoring of most
algorithms.
--------------------------------------------------------------------------------
'psimpl' is licensed under the Mozilla Public License Version 1.1 (MPL), see
the accompanying LICENSE.txt file. Alternatively a copy of this license may be
obtained from http://www.mozilla.org/MPL/.
--------------------------------------------------------------------------------
'psimpl' is hosted at SourceForge: http://sourceforge.net/projects/psimpl/ and
has a dedicated website: http://psimpl.sf.net
Originally psimpl was released as part of the article 'Polyline Simplification'
at The Code Project:
http://www.codeproject.com/KB/recipes/PolylineSimplification.aspx
================================================================================
'psimpl' is a c++ polyline simplification library that is generic, easy to use,
and supports the following algorithms:
Simplification
* Nth point - A naive algorithm that keeps only each nth point
* Distance between points - Removes successive points that are clustered
together
* Perpendicular distance - Removes points based on their distance to the line
segment defined by their left and right neighbors
* Reumann-Witkam - Shifts a strip along the polyline and removes points that
fall outside
* Opheim - A constrained version of Reumann-Witkam
* Lang - Similar to the Perpendicular distance routine, but instead of looking
only at direct neighbors, an entire search region is processed
* Douglas-Peucker - A classic simplification algorithm that provides an
excellent approximation of the original line
* A variation on the Douglas-Peucker algorithm - Slower, but yields better
results at lower resolutions
Errors
* positional error - Distance of each polyline point to its simplification
All the algorithms have been implemented in a single standalone C++ header
using an STL-style interface that operates on input and output iterators.
Polylines can be of any dimension, and defined using floating point or signed
integer data types.
================================================================================
The demo package contains a win32 demo application for 'psimpl'. The demo
application allows you to experiment with the different simplification
algorithms. It can generate pseudo random 2D-polylines of up to 10.000.000
vertices in various types of containers. The boundingbox of the generated
polyline is always 2n x n, where n is the amount of vertices of the generated
polyline. Use this fact to specify a proper distance tolerance.
Internally, the generated and simplified polyline are always stored in a
QVector<double>. Just before simplification, it is converted to the selected
container type. Afterwards, this temporary container is destructed. Normally you
won't notice this, but it seems that creating and destructing a
std::list(10.000.000) can take a rather long time. The resulting performance
measurements never include these conversion steps. I chose this approach as it
allowed me to quickly add new container types.
Note that the entire application is single threaded (sorry for being lazy),
meaning it could go 'not responding' during a long running simplification.
The demo application was made using Qt 4.7.3, Qt Creator 2.1.0 and Visual Studio
2008 Express. Complete source code is included.
================================================================================
If you decide to use my code for your (commercial) project, let me know! I would
love to hear where my code ends up and why you chose to use it! If possible, a
voluntary donation to my PayPal account (edekoning@gmail.com) would be much
appreciated.
Regards,
Elmar de Koning
edekoning@gmail.com