Statistics
| Revision:

svn-gvsig-desktop / tags / v1_1_2_Build_1041 / libraries / libjni-proj4 / src / bchgen.c @ 33839

History | View | Annotate | Download (1.43 KB)

1
/* generate double bivariate Chebychev polynomial */
2
#ifndef lint
3
static const char SCCSID[]="@(#)bchgen.c        4.5        94/03/22        GIE        REL";
4
#endif
5
#include <projects.h>
6
        int
7
bchgen(projUV a, projUV b, int nu, int nv, projUV **f, projUV(*func)(projUV)) {
8
        int i, j, k;
9
        projUV arg, *t, bma, bpa, *c;
10
        double d, fac;
11

    
12
        bma.u = 0.5 * (b.u - a.u); bma.v = 0.5 * (b.v - a.v);
13
        bpa.u = 0.5 * (b.u + a.u); bpa.v = 0.5 * (b.v + a.v);
14
        for ( i = 0; i < nu; ++i) {
15
                arg.u = cos(PI * (i + 0.5) / nu) * bma.u + bpa.u;
16
                for ( j = 0; j < nv; ++j) {
17
                        arg.v = cos(PI * (j + 0.5) / nv) * bma.v + bpa.v;
18
                        f[i][j] = (*func)(arg);
19
                        if ((f[i][j]).u == HUGE_VAL)
20
                                return(1);
21
                }
22
        }
23
        if (!(c = (projUV *) vector1(nu, sizeof(projUV)))) return 1;
24
        fac = 2. / nu;
25
        for ( j = 0; j < nv ; ++j) {
26
                for ( i = 0; i < nu; ++i) {
27
                        arg.u = arg.v = 0.;
28
                        for (k = 0; k < nu; ++k) {
29
                                d = cos(PI * i * (k + .5) / nu);
30
                                arg.u += f[k][j].u * d;
31
                                arg.v += f[k][j].v * d;
32
                        }
33
                        arg.u *= fac;
34
                        arg.v *= fac;
35
                        c[i] = arg;
36
                }
37
                for (i = 0; i < nu; ++i)
38
                        f[i][j] = c[i];
39
        }
40
        pj_dalloc(c);
41
        if (!(c = (projUV*) vector1(nv, sizeof(projUV)))) return 1;
42
        fac = 2. / nv;
43
        for ( i = 0; i < nu; ++i) {
44
                t = f[i];
45
                for (j = 0; j < nv; ++j) {
46
                        arg.u = arg.v = 0.;
47
                        for (k = 0; k < nv; ++k) {
48
                                d = cos(PI * j * (k + .5) / nv);
49
                                arg.u += t[k].u * d;
50
                                arg.v += t[k].v * d;
51
                        }
52
                        arg.u *= fac;
53
                        arg.v *= fac;
54
                        c[j] = arg;
55
                }
56
                f[i] = c;
57
                c = t;
58
        }
59
        pj_dalloc(c);
60
        return(0);
61
}