[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