Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libjni-proj4 / src / bch2bps.c @ 7098

History | View | Annotate | Download (3.6 KB)

1
/* convert bivariate w Chebyshev series to w Power series */
2
#ifndef lint
3
static const char SCCSID[]="@(#)bch2bps.c        4.5        94/03/22        GIE        REL";
4
#endif
5
#include <projects.h>
6
/* basic support procedures */
7
        static void /* clear vector to zero */
8
clear(projUV *p, int n) { static const projUV c = {0., 0.}; while (n--) *p++ = c; }
9
        static void /* clear matrix rows to zero */
10
bclear(projUV **p, int n, int m) { while (n--) clear(*p++, m); }
11
        static void /* move vector */
12
bmove(projUV *a, projUV *b, int n) { while (n--) *a++ = *b++; }
13
        static void /* a <- m * b - c */
14
submop(projUV *a, double m, projUV *b, projUV *c, int n) {
15
        while (n--) {
16
                a->u = m * b->u - c->u;
17
                a++->v = m * b++->v - c++->v;
18
        }
19
}
20
        static void /* a <- b - c */
21
subop(projUV *a, projUV *b, projUV *c, int n) {
22
        while (n--) {
23
                a->u = b->u - c->u;
24
                a++->v = b++->v - c++->v;
25
        }
26
}
27
        static void /* multiply vector a by scalar m */
28
dmult(projUV *a, double m, int n) { while(n--) { a->u *= m; a->v *= m; ++a; } }
29
        static void /* row adjust a[] <- a[] - m * b[] */
30
dadd(projUV *a, projUV *b, double m, int n) {
31
        while(n--) {
32
                a->u -= m * b->u;
33
                a++->v -= m * b++->v;
34
        }
35
}
36
        static void /* convert row to pover series */
37
rows(projUV *c, projUV *d, int n) {
38
        projUV sv, *dd;
39
        int j, k;
40

    
41
        dd = (projUV *)vector1(n-1, sizeof(projUV));
42
        sv.u = sv.v = 0.;
43
        for (j = 0; j < n; ++j) d[j] = dd[j] = sv;
44
        d[0] = c[n-1];
45
        for (j = n-2; j >= 1; --j) {
46
                for (k = n-j; k >= 1; --k) {
47
                        sv = d[k];
48
                        d[k].u = 2. * d[k-1].u - dd[k].u;
49
                        d[k].v = 2. * d[k-1].v - dd[k].v;
50
                        dd[k] = sv;
51
                }
52
                sv = d[0];
53
                d[0].u = -dd[0].u + c[j].u;
54
                d[0].v = -dd[0].v + c[j].v;
55
                dd[0] = sv;
56
        }
57
        for (j = n-1; j >= 1; --j) {
58
                d[j].u = d[j-1].u - dd[j].u;
59
                d[j].v = d[j-1].v - dd[j].v;
60
        }
61
        d[0].u = -dd[0].u + .5 * c[0].u;
62
        d[0].v = -dd[0].v + .5 * c[0].v;
63
        pj_dalloc(dd);
64
}
65
        static void /* convert columns to power series */
66
cols(projUV **c, projUV **d, int nu, int nv) {
67
        projUV *sv, **dd;
68
        int j, k;
69

    
70
        dd = (projUV **)vector2(nu, nv, sizeof(projUV));
71
        sv = (projUV *)vector1(nv, sizeof(projUV));
72
        bclear(d, nu, nv);
73
        bclear(dd, nu, nv);
74
        bmove(d[0], c[nu-1], nv);
75
        for (j = nu-2; j >= 1; --j) {
76
                for (k = nu-j; k >= 1; --k) {
77
                        bmove(sv, d[k], nv);
78
                        submop(d[k], 2., d[k-1], dd[k], nv);
79
                        bmove(dd[k], sv, nv);
80
                }
81
                bmove(sv, d[0], nv);
82
                subop(d[0], c[j], dd[0], nv);
83
                bmove(dd[0], sv, nv);
84
        }
85
        for (j = nu-1; j >= 1; --j)
86
                subop(d[j], d[j-1], dd[j], nv);
87
        submop(d[0], .5, c[0], dd[0], nv);
88
        freev2((void **) dd, nu);
89
        pj_dalloc(sv);
90
}
91
        static void /* row adjust for range -1 to 1 to a to b */
92
rowshft(double a, double b, projUV *d, int n) {
93
        int k, j;
94
        double fac, cnst;
95

    
96
        cnst = 2. / (b - a);
97
        fac = cnst;
98
        for (j = 1; j < n; ++j) {
99
                d[j].u *= fac;
100
                d[j].v *= fac;
101
                fac *= cnst;
102
        }
103
        cnst = .5 * (a + b);
104
        for (j = 0; j <= n-2; ++j)
105
                for (k = n - 2; k >= j; --k) {
106
                        d[k].u -= cnst * d[k+1].u;
107
                        d[k].v -= cnst * d[k+1].v;
108
                }
109
}
110
        static void /* column adjust for range -1 to 1 to a to b */
111
colshft(double a, double b, projUV **d, int n, int m) {
112
        int k, j;
113
        double fac, cnst;
114

    
115
        cnst = 2. / (b - a);
116
        fac = cnst;
117
        for (j = 1; j < n; ++j) {
118
                dmult(d[j], fac, m);
119
                fac *= cnst;
120
        }
121
        cnst = .5 * (a + b);
122
        for (j = 0; j <= n-2; ++j)
123
                for (k = n - 2; k >= j; --k)
124
                        dadd(d[k], d[k+1], cnst, m);
125
}
126
        int /* entry point */
127
bch2bps(projUV a, projUV b, projUV **c, int nu, int nv) {
128
        projUV **d;
129
        int i;
130

    
131
        if (nu < 1 || nv < 1 || !(d = (projUV **)vector2(nu, nv, sizeof(projUV))))
132
                return 0;
133
        /* do rows to power series */
134
        for (i = 0; i < nu; ++i) {
135
                rows(c[i], d[i], nv);
136
                rowshft(a.v, b.v, d[i], nv);
137
        }
138
        /* do columns to power series */
139
        cols(d, c, nu, nv);
140
        colshft(a.u, b.u, c, nu, nv);
141
        freev2((void **) d, nu);
142
        return 1;
143
}