Fortran module that reduces the over-sampled resolution of a polyline. This process can be useful when working with data that is noisy but usable with a significantly reduced resolution.
The simplify module is all that is necessary to use the polyline simplification algorithms. The simplify module does depend on a smpl_precision module that at least needs to contain a real kind named dp. In this case, it uses the double precision real kind from the stdlib_kinds module found in stdlib. This can easily be modified to accept a real kind with another name in a different module by changing the line in simplify.f90 from
use smpl_precisionto
use real_kinds_module, only : dp => real_kindAll that is left is to add a use statement for the module in whichever program units you need the algorithms and to compile the module as normal.
To add fortran-simplify to your fpm project, simply add the following line to the fpm.toml file under the [dependencies] tag:
fortran-simplify.git = "https://github.com/jaiken17/fortran-simplify"Included is a simple test program that runs the algorithms on a couple of curves. The two dimensional curve is also written to a file curve.data and the output from the perpendicular distance and Reumann-Witkam algorithms are written to perp_simple_curve.data and ruemann_witkam_simple_curve.data, respectively.
With the Fortran Package Manager (fpm) installed, compile and run the example program in a shell by excuting the following command in the top-level project directory:
fpm run --exampleThe data files are then created in the example directory and can then be plotted with gnuplot by running the plot bash script (within the example directory):
./plotFor a better explanation of each algorithm see Polyline Simplification which also includes graphical representations to aid in understanding.
Implementation of the nth point algorithm. Takes two intent(in) parameters:
curve- areal(dp),dimension(:)orreal(dp),dimension(:,:)array containing the points of the curve to be simplified. Ifreal(dp), dimension(:,:), thencurve(i,:)denotes each point of the curve (column major).n- a defaultintegerthat is interpreted as every nth element to be kept.
This function is of the same type as curve.
Implementation of the radial distance algorithm. Takes two intent(in) parameters:
curve- areal(dp),dimension(:)orreal(dp),dimension(:,:)array containing the points of the curve to be simplified. Ifreal(dp), dimension(:,:), thencurve(i,:)denotes each point of the curve (column major).tolerance- areal(dp)value interpreted as the minimum distance required between any two consecutive points in the resulting curve.
This function is of the same type as curve.
Implementation of the perpendicular distance algorithm. Takes up to three intent(in) parameters:
curve- areal(dp),dimension(:,:)array containing the points of the curve to be simplified.curve(i,:)denotes each point of the curve (column major).tolerance- areal(dp)value interpreted as the minimum distance a point can be from the line defined by the most recent confirmed key and the next point in the original curve.repeat- an optional, defaultintegerthat describes how many times to run the algorithm. This parameter is useful as the algorithm will at most remove 50% of the points from a given curve.
This function is of the same type as curve.
Implementation of the Reumann-Witkam algorithm. Takes two parameters:
curve- areal(dp),dimension(:,:)array containing the points of the curve to be simplified.curve(i,:)denotes each point of the curve (column major).tolerance- areal(dp)value interpreted as the minimum distance points must be from any line segment.
This function is of the same type as curve.