diff options
author | tlatorre <tlatorre@uchicago.edu> | 2018-11-21 08:29:53 -0600 |
---|---|---|
committer | tlatorre <tlatorre@uchicago.edu> | 2018-11-21 08:29:53 -0600 |
commit | 47ca1a4f7e70c302c7c31d54c35ed3c2d3f757ef (patch) | |
tree | 57864c7e524664cf478e3c2ce8b6211cc1f20652 | |
parent | b3e0ad9546d3baa4317056a332009ae3b2b3afa6 (diff) | |
download | sddm-47ca1a4f7e70c302c7c31d54c35ed3c2d3f757ef.tar.gz sddm-47ca1a4f7e70c302c7c31d54c35ed3c2d3f757ef.tar.bz2 sddm-47ca1a4f7e70c302c7c31d54c35ed3c2d3f757ef.zip |
speed up normalize() and interp[12]d()
-rw-r--r-- | src/misc.c | 18 | ||||
-rw-r--r-- | src/vector.c | 4 |
2 files changed, 15 insertions, 7 deletions
@@ -352,6 +352,7 @@ double interp2d(double x, double y, double *xp, double *yp, double *zp, size_t n * See https://en.wikipedia.org/wiki/Bilinear_interpolation. */ size_t i, j; double q11, q12, q21, q22; + double idx, idy; if (x <= xp[0]) { fprintf(stderr, "x < xp[0]!\n"); @@ -363,14 +364,18 @@ double interp2d(double x, double y, double *xp, double *yp, double *zp, size_t n exit(1); } - i = (x-xp[0])/(xp[1]-xp[0]); + idx = 1.0/(xp[1]-xp[0]); + + i = (x-xp[0])*idx; if (i > n1-2) { fprintf(stderr, "i > n1 - 2!\n"); exit(1); } - j = (y-yp[0])/(yp[1]-yp[0]); + idy = 1.0/(yp[1]-yp[0]); + + j = (y-yp[0])*idy; if (j > n2-2) { fprintf(stderr, "j > n2 - 2!\n"); @@ -382,7 +387,7 @@ double interp2d(double x, double y, double *xp, double *yp, double *zp, size_t n q21 = zp[(i+1)*n2+j]; q22 = zp[(i+1)*n2+j+1]; - return (q11*(xp[i+1]-x)*(yp[j+1]-y) + q21*(x-xp[i])*(yp[j+1]-y) + q12*(xp[i+1]-x)*(y-yp[j]) + q22*(x-xp[i])*(y-yp[j]))/((xp[i+1]-xp[i])*(yp[i+1]-yp[i])); + return (q11*(xp[i+1]-x)*(yp[j+1]-y) + q21*(x-xp[i])*(yp[j+1]-y) + q12*(xp[i+1]-x)*(y-yp[j]) + q22*(x-xp[i])*(y-yp[j]))*idx*idy; } double interp1d(double x, double *xp, double *yp, size_t n) @@ -392,14 +397,17 @@ double interp1d(double x, double *xp, double *yp, size_t n) * * If x < xp[0] returns yp[0] and if x > xp[n-1] returns yp[n-1]. */ size_t i; + double idx; if (x <= xp[0]) return yp[0]; - i = (x-xp[0])/(xp[1]-xp[0]); + idx = 1.0/(xp[1]-xp[0]); + + i = (x-xp[0])*idx; if (i > n-2) return yp[n-1]; - return yp[i] + (yp[i+1]-yp[i])*(x-xp[i])/(xp[i+1]-xp[i]); + return yp[i] + (yp[i+1]-yp[i])*(x-xp[i])*idx; } int isclose(double a, double b, double rel_tol, double abs_tol) diff --git a/src/vector.c b/src/vector.c index d0e304a..061c3d6 100644 --- a/src/vector.c +++ b/src/vector.c @@ -4,8 +4,8 @@ void normalize(double *a) { double c; - c = NORM(a); - DIV(a,c); + c = 1.0/NORM(a); + MUL(a,c); } void rotate(double *dest, double *v, double *n, double phi) |