Menu

[r3189]: / trunk / toolkits / basemap / src / geod_inv.c  Maximize  Restore  History

Download this file

63 lines (60 with data), 2.0 kB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#ifndef lint
static const char SCCSID[]="@(#)geod_inv.c 4.5 95/09/23 GIE REL";
#endif
# include "projects.h"
# include "geodesic.h"
# define DTOL 1e-12
int
geod_inv(GEODESIC_T *GEODESIC)
{
double th1,th2,thm,dthm,dlamm,dlam,sindlamm,costhm,sinthm,cosdthm,
sindthm,L,E,cosd,d,X,Y,T,sind,tandlammp,u,v,D,A,B;
if (GEODESIC->ELLIPSE) {
th1 = atan(GEODESIC->ONEF * tan(GEODESIC->p1.u));
th2 = atan(GEODESIC->ONEF * tan(GEODESIC->p2.u));
} else {
th1 = GEODESIC->p1.u;
th2 = GEODESIC->p2.u;
}
thm = .5 * (th1 + th2);
dthm = .5 * (th2 - th1);
dlamm = .5 * ( dlam = adjlon(GEODESIC->p2.v - GEODESIC->p1.v) );
if (fabs(dlam) < DTOL && fabs(dthm) < DTOL) {
GEODESIC->ALPHA12 = GEODESIC->ALPHA21 = GEODESIC->DIST = 0.;
return -1;
}
sindlamm = sin(dlamm);
costhm = cos(thm); sinthm = sin(thm);
cosdthm = cos(dthm); sindthm = sin(dthm);
L = sindthm * sindthm + (cosdthm * cosdthm - sinthm * sinthm)
* sindlamm * sindlamm;
d = acos(cosd = 1 - L - L);
if (GEODESIC->ELLIPSE) {
E = cosd + cosd;
sind = sin( d );
Y = sinthm * cosdthm;
Y *= (Y + Y) / (1. - L);
T = sindthm * costhm;
T *= (T + T) / L;
X = Y + T;
Y -= T;
T = d / sind;
D = 4. * T * T;
A = D * E;
B = D + D;
GEODESIC->DIST = GEODESIC->A * sind * (T - GEODESIC->FLAT4 * (T * X - Y) +
GEODESIC->FLAT64 * (X * (A + (T - .5 * (A - E)) * X) -
Y * (B + E * Y) + D * X * Y));
tandlammp = tan(.5 * (dlam - .25 * (Y + Y - E * (4. - X)) *
(GEODESIC->FLAT2 * T + GEODESIC->FLAT64 * (32. * T - (20. * T - A)
* X - (B + 4.) * Y)) * tan(dlam)));
} else {
GEODESIC->DIST = GEODESIC->A * d;
tandlammp = tan(dlamm);
}
u = atan2(sindthm , (tandlammp * costhm));
v = atan2(cosdthm , (tandlammp * sinthm));
GEODESIC->ALPHA12 = adjlon(TWOPI + v - u);
GEODESIC->ALPHA21 = adjlon(TWOPI - v - u);
return 0;
}
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.