98 lines
5.2 KiB
Plaintext
98 lines
5.2 KiB
Plaintext
|
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
|