Statistics
| Revision:

svn-gvsig-desktop / tags / gvsig_topologia-0_1_0-1232 / libraries / libjni-proj4 / src / biveval.c @ 45670

History | View | Annotate | Download (1.91 KB)

1
/* procedures for evaluating Tseries */
2
#ifndef lint
3
static const char SCCSID[]="@(#)biveval.c        4.4        93/06/12        GIE        REL";
4
#endif
5
# include <projects.h>
6
# define NEAR_ONE        1.00001
7
        static projUV
8
w2, w;
9
static double ceval(struct PW_COEF *C, int n) {
10
        double d=0, dd=0, vd, vdd, tmp, *c;
11
        int j;
12

    
13
        for (C += n ; n-- ; --C ) {
14
                if (j = C->m) {
15
                        vd = vdd = 0.;
16
                        for (c = C->c + --j; j ; --j ) {
17
                                vd = w2.v * (tmp = vd) - vdd + *c--;
18
                                vdd = tmp;
19
                        }
20
                        d = w2.u * (tmp = d) - dd + w.v * vd - vdd + 0.5 * *c;
21
                } else
22
                        d = w2.u * (tmp = d) - dd;
23
                dd = tmp;
24
        }
25
        if (j = C->m) {
26
                vd = vdd = 0.;
27
                for (c = C->c + --j; j ; --j ) {
28
                        vd = w2.v * (tmp = vd) - vdd + *c--;
29
                        vdd = tmp;
30
                }
31
                return (w.u * d - dd + 0.5 * ( w.v * vd - vdd + 0.5 * *c ));
32
        } else
33
                return (w.u * d - dd);
34
}
35
        projUV /* bivariate Chebyshev polynomial entry point */
36
bcheval(projUV in, Tseries *T) {
37
        projUV out;
38
                /* scale to +-1 */
39
         w.u = ( in.u + in.u - T->a.u ) * T->b.u;
40
         w.v = ( in.v + in.v - T->a.v ) * T->b.v;
41
        if (fabs(w.u) > NEAR_ONE || fabs(w.v) > NEAR_ONE) {
42
                out.u = out.v = HUGE_VAL;
43
                pj_errno = -36;
44
        } else { /* double evaluation */
45
                w2.u = w.u + w.u;
46
                w2.v = w.v + w.v;
47
                out.u = ceval(T->cu, T->mu);
48
                out.v = ceval(T->cv, T->mv);
49
        }
50
        return out;
51
}
52
        projUV /* bivariate power polynomial entry point */
53
bpseval(projUV in, Tseries *T) {
54
        projUV out;
55
        double *c, row;
56
        int i, m;
57

    
58
        out.u = out.v = 0.;
59
        for (i = T->mu; i >= 0; --i) {
60
                row = 0.;
61
                if (m = T->cu[i].m) {
62
                        c = T->cu[i].c + m;
63
                        while (m--)
64
                                row = *--c + in.v * row;
65
                }
66
                out.u = row + in.u * out.u;
67
        }
68
        for (i = T->mv; i >= 0; --i) {
69
                row = 0.;
70
                if (m = T->cv[i].m) {
71
                        c = T->cv[i].c + m;
72
                        while (m--)
73
                                row = *--c + in.v * row;
74
                }
75
                out.v = row + in.u * out.v;
76
        }
77
        return out;
78
}
79

    
80
projUV /* general entry point selecting evaluation mode */
81
biveval(projUV in, Tseries *T) {
82

    
83
    if (T->power) {
84
        return bpseval(in, T);
85
    } else {
86
        return bcheval(in, T);
87
    }
88
}
89