[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [labplot] src/backend/nsl: added line simplification positional error estimation function
From: Stefan Gerlach <stefan.gerlach () uni-konstanz ! de>
Date: 2016-08-31 17:40:36
Message-ID: E1bf9V6-0001wd-85 () code ! kde ! org
[Download RAW message or body]
Git commit 080177df06381c7422ae1819f6194531155d00e7 by Stefan Gerlach.
Committed on 31/08/2016 at 17:40.
Pushed by sgerlach into branch 'master'.
added line simplification positional error estimation function
M +20 -2 src/backend/nsl/nsl_geom_linesim.c
M +13 -9 src/backend/nsl/nsl_geom_linesim.h
M +8 -8 src/backend/nsl/nsl_geom_linesim_test.c
http://commits.kde.org/labplot/080177df06381c7422ae1819f6194531155d00e7
diff --git a/src/backend/nsl/nsl_geom_linesim.c b/src/backend/nsl/nsl_geom_linesim.c
index b1eafe9..3658c0e 100644
--- a/src/backend/nsl/nsl_geom_linesim.c
+++ b/src/backend/nsl/nsl_geom_linesim.c
@@ -32,6 +32,23 @@
#include "nsl_geom.h"
#include "nsl_geom_linesim.h"
+double nsl_geom_linesim_positional_error(const double xdata[], const double ydata[], \
const size_t n, const size_t index[]) { + double dist=0;
+ size_t i=0, j; /* index of index[] */
+ do {
+ /*for every point not in index[] calculate distance to line*/
+ /*printf("i=%d (index[i]-index[i+1]=%d-%d)\n", i , index[i], index[i+1]);*/
+ for(j=1;j<index[i+1]-index[i];j++) {
+ /*printf("i=%d: j=%d\n", i, j);*/
+ dist += nsl_geom_point_line_dist(xdata[index[i]], ydata[index[i]], \
xdata[index[i+1]], ydata[index[i+1]], xdata[index[i]+j], ydata[index[i]+j]); \
+ /*printf("dist = %g\n", dist);*/ + }
+ i++;
+ } while(index[i] != n-1);
+
+ return dist;
+}
+
size_t nsl_geom_linesim_nthpoint(const size_t n, const size_t step, size_t index[]) \
{ size_t nout=0, i;
@@ -280,7 +297,8 @@ size_t nsl_geom_linesim_douglas_peucker(const double xdata[], \
const double ydata index[nout++] = n-1;
/* sort array index */
- int compare(const void* a, const void* b) {
+ /* TODO: put in extra file */
+ int nsl_compare(const void* a, const void* b) {
size_t _a = * ( (size_t*) a );
size_t _b = * ( (size_t*) b );
@@ -288,7 +306,7 @@ size_t nsl_geom_linesim_douglas_peucker(const double xdata[], \
const double ydata return (_a > _b) - (_a < _b);
}
- qsort(index, nout, sizeof(size_t), compare);
+ qsort(index, nout, sizeof(size_t), nsl_compare);
return nout;
}
diff --git a/src/backend/nsl/nsl_geom_linesim.h b/src/backend/nsl/nsl_geom_linesim.h
index 60c6803..d6d14ec 100644
--- a/src/backend/nsl/nsl_geom_linesim.h
+++ b/src/backend/nsl/nsl_geom_linesim.h
@@ -31,14 +31,18 @@
#include <stdlib.h>
+/* calculates positional error (summed perpendicular distance)
+ from simplified set (given by index[])
+*/
+double nsl_geom_linesim_positional_error(const double xdata[], const double ydata[], \
const size_t n, const size_t index[]); +
/* simple n-th point line simplification
n: number of points
step: step size
index: index of reduced points
-> returns final number of points
*/
-size_t nsl_geom_linesim_nthpoint(size_t n, size_t step, size_t index[]);
-
+size_t nsl_geom_linesim_nthpoint(const size_t n, const size_t step, size_t index[]);
/* radial distance line simplification
xdata, ydata: data points
@@ -47,7 +51,7 @@ size_t nsl_geom_linesim_nthpoint(size_t n, size_t step, size_t \
index[]); index: index of reduced points
-> returns final number of points
*/
-size_t nsl_geom_linesim_raddist(const double xdata[], const double ydata[], size_t \
n, double eps, size_t index[]); +size_t nsl_geom_linesim_raddist(const double \
xdata[], const double ydata[], const size_t n, const double eps, size_t index[]);
/* perpendicular distance line simplification
xdata, ydata: data points
@@ -56,11 +60,11 @@ size_t nsl_geom_linesim_raddist(const double xdata[], const \
double ydata[], size index: index of reduced points
-> returns final number of points
*/
-size_t nsl_geom_linesim_perpdist(const double xdata[], const double ydata[], size_t \
n, double eps, size_t index[]); +size_t nsl_geom_linesim_perpdist(const double \
xdata[], const double ydata[], const size_t n, const double eps, size_t index[]); /* \
repeat perpendicular distance line simplification repeat: number of repeats
*/
-size_t nsl_geom_linesim_perpdist_repeat(const double xdata[], const double ydata[], \
size_t n, double eps, size_t repeat, size_t index[]); +size_t \
nsl_geom_linesim_perpdist_repeat(const double xdata[], const double ydata[], const \
size_t n, const double eps, const size_t repeat, size_t index[]);
/* Reumann-Witkam line simplification
xdata, ydata: data points
@@ -69,7 +73,7 @@ size_t nsl_geom_linesim_perpdist_repeat(const double xdata[], const \
double ydata index: index of reduced points
-> returns final number of points
*/
-size_t nsl_geom_linesim_reumann_witkam(const double xdata[], const double ydata[], \
size_t n, double eps, size_t index[]); +size_t nsl_geom_linesim_reumann_witkam(const \
double xdata[], const double ydata[], const size_t n, const double eps, size_t \
index[]);
/* Opheim line simplification
xdata, ydata: data points
@@ -79,7 +83,7 @@ size_t nsl_geom_linesim_reumann_witkam(const double xdata[], const \
double ydata[ index: index of reduced points
-> returns final number of points
*/
-size_t nsl_geom_linesim_opheim(const double xdata[], const double ydata[], size_t n, \
double mineps, double maxeps, size_t index[]); +size_t nsl_geom_linesim_opheim(const \
double xdata[], const double ydata[], const size_t n, const double mineps, const \
double maxeps, size_t index[]);
/* Lang line simplification
xdata, ydata: data points
@@ -89,7 +93,7 @@ size_t nsl_geom_linesim_opheim(const double xdata[], const double \
ydata[], size_ index: index of reduced points
-> returns final number of points
*/
-size_t nsl_geom_linesim_lang(const double xdata[], const double ydata[], size_t n, \
double eps, size_t region, size_t index[]); +size_t nsl_geom_linesim_lang(const \
double xdata[], const double ydata[], const size_t n, const double eps, const size_t \
region, size_t index[]);
/* Douglas-Peucker line simplification
xdata, ydata: data points
@@ -99,6 +103,6 @@ size_t nsl_geom_linesim_lang(const double xdata[], const double \
ydata[], size_t index: index of reduced points
-> returns final number of points
*/
-size_t nsl_geom_linesim_douglas_peucker(const double xdata[], const double ydata[], \
size_t n, double eps, size_t index[]); +size_t nsl_geom_linesim_douglas_peucker(const \
double xdata[], const double ydata[], const size_t n, const double eps, size_t \
index[]);
#endif /* NSL_GEOM_LINESIM_H */
diff --git a/src/backend/nsl/nsl_geom_linesim_test.c \
b/src/backend/nsl/nsl_geom_linesim_test.c index caa5f83..89c4fea 100644
--- a/src/backend/nsl/nsl_geom_linesim_test.c
+++ b/src/backend/nsl/nsl_geom_linesim_test.c
@@ -37,7 +37,7 @@ double main() {
printf("* n-th point\n");
size_t nout = nsl_geom_linesim_nthpoint(n, np, index);
- printf("nout = %d\n", nout);
+ printf("nout = %d (error = %g)\n", nout, nsl_geom_linesim_positional_error(xdata, \
ydata, n, index));
size_t i;
for(i=0; i<nout; i++)
@@ -46,7 +46,7 @@ double main() {
const double eps=1.5;
printf("* radial distance\n");
nout = nsl_geom_linesim_raddist(xdata, ydata, n, eps, index);
- printf("nout = %d\n", nout);
+ printf("nout = %d (error = %g)\n", nout, nsl_geom_linesim_positional_error(xdata, \
ydata, n, index));
for(i=0; i<nout; i++)
printf("%d: %d\n", i, index[i]);
@@ -55,15 +55,15 @@ double main() {
const size_t repeat = 3;
printf("* perpendicular distance (repeat = %d)\n", repeat);
nout = nsl_geom_linesim_perpdist_repeat(xdata, ydata, n, eps2, repeat, index);
- printf("nout = %d\n", nout);
+ printf("nout = %d (error = %g)\n", nout, nsl_geom_linesim_positional_error(xdata, \
ydata, n, index));
for(i=0; i<nout; i++)
printf("%d: %d\n", i, index[i]);
- const double eps3=0.5;
+ const double eps3=0.7;
printf("* perp. distance (Reumann-Witkam)\n");
nout = nsl_geom_linesim_reumann_witkam(xdata, ydata, n, eps3, index);
- printf("nout = %d\n", nout);
+ printf("nout = %d (error = %g)\n", nout, nsl_geom_linesim_positional_error(xdata, \
ydata, n, index));
for(i=0; i<nout; i++)
printf("%d: %d\n", i, index[i]);
@@ -72,7 +72,7 @@ double main() {
const double maxeps=7.0;
printf("* perp. distance (Opheim)\n");
nout = nsl_geom_linesim_opheim(xdata, ydata, n, mineps, maxeps, index);
- printf("nout = %d\n", nout);
+ printf("nout = %d (error = %g)\n", nout, nsl_geom_linesim_positional_error(xdata, \
ydata, n, index));
for(i=0; i<nout; i++)
printf("%d: %d\n", i, index[i]);
@@ -81,7 +81,7 @@ double main() {
const size_t region=5;
printf("* simplification (Lang)\n");
nout = nsl_geom_linesim_lang(xdata, ydata, n, eps4, region, index);
- printf("nout = %d\n", nout);
+ printf("nout = %d (error = %g)\n", nout, nsl_geom_linesim_positional_error(xdata, \
ydata, n, index));
for(i=0; i<nout; i++)
printf("%d: %d\n", i, index[i]);
@@ -89,7 +89,7 @@ double main() {
const double eps5=0.6;
printf("* simplification (Douglas Peucker)\n");
nout = nsl_geom_linesim_douglas_peucker(xdata, ydata, n, eps5, index);
- printf("nout = %d\n", nout);
+ printf("nout = %d (error = %g)\n", nout, nsl_geom_linesim_positional_error(xdata, \
ydata, n, index));
for(i=0; i<nout; i++)
printf("%d: %d\n", i, index[i]);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic