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 |
|