aboutsummaryrefslogtreecommitdiff
path: root/src/bchgen.c
diff options
context:
space:
mode:
authorFrank Warmerdam <warmerdam@pobox.com>1999-03-18 16:34:52 +0000
committerFrank Warmerdam <warmerdam@pobox.com>1999-03-18 16:34:52 +0000
commit565a4bd035b9d4a83955808efef20f1d8dfa24cf (patch)
tree75785fc897708023f1ccdaf40079afcbaaf0fd3a /src/bchgen.c
downloadPROJ-565a4bd035b9d4a83955808efef20f1d8dfa24cf.tar.gz
PROJ-565a4bd035b9d4a83955808efef20f1d8dfa24cf.zip
New
git-svn-id: http://svn.osgeo.org/metacrs/proj/trunk@776 4e78687f-474d-0410-85f9-8d5e500ac6b2
Diffstat (limited to 'src/bchgen.c')
-rw-r--r--src/bchgen.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/bchgen.c b/src/bchgen.c
new file mode 100644
index 00000000..cc03f037
--- /dev/null
+++ b/src/bchgen.c
@@ -0,0 +1,61 @@
+/* generate double bivariate Chebychev polynomial */
+#ifndef lint
+static const char SCCSID[]="@(#)bchgen.c 4.5 94/03/22 GIE REL";
+#endif
+#include <projects.h>
+ int
+bchgen(UV a, UV b, int nu, int nv, UV **f, UV(*func)(UV)) {
+ int i, j, k;
+ UV arg, *t, bma, bpa, *c;
+ double d, fac;
+
+ bma.u = 0.5 * (b.u - a.u); bma.v = 0.5 * (b.v - a.v);
+ bpa.u = 0.5 * (b.u + a.u); bpa.v = 0.5 * (b.v + a.v);
+ for ( i = 0; i < nu; ++i) {
+ arg.u = cos(PI * (i + 0.5) / nu) * bma.u + bpa.u;
+ for ( j = 0; j < nv; ++j) {
+ arg.v = cos(PI * (j + 0.5) / nv) * bma.v + bpa.v;
+ f[i][j] = (*func)(arg);
+ if ((f[i][j]).u == HUGE_VAL)
+ return(1);
+ }
+ }
+ if (!(c = vector1(nu, sizeof(UV)))) return 1;
+ fac = 2. / nu;
+ for ( j = 0; j < nv ; ++j) {
+ for ( i = 0; i < nu; ++i) {
+ arg.u = arg.v = 0.;
+ for (k = 0; k < nu; ++k) {
+ d = cos(PI * i * (k + .5) / nu);
+ arg.u += f[k][j].u * d;
+ arg.v += f[k][j].v * d;
+ }
+ arg.u *= fac;
+ arg.v *= fac;
+ c[i] = arg;
+ }
+ for (i = 0; i < nu; ++i)
+ f[i][j] = c[i];
+ }
+ pj_dalloc(c);
+ if (!(c = vector1(nv, sizeof(UV)))) return 1;
+ fac = 2. / nv;
+ for ( i = 0; i < nu; ++i) {
+ t = f[i];
+ for (j = 0; j < nv; ++j) {
+ arg.u = arg.v = 0.;
+ for (k = 0; k < nv; ++k) {
+ d = cos(PI * j * (k + .5) / nv);
+ arg.u += t[k].u * d;
+ arg.v += t[k].v * d;
+ }
+ arg.u *= fac;
+ arg.v *= fac;
+ c[j] = arg;
+ }
+ f[i] = c;
+ c = t;
+ }
+ pj_dalloc(c);
+ return(0);
+}