|
|
1.1 root 1: #include "map.h"
2:
3: static double
4: quadratic(double a, double b, double c)
5: {
6: double disc = b*b - 4*a*c;
7: return disc<0? 0: (-b-sqrt(disc))/(2*a);
8: }
9:
10: /* for projections with meridians being circles centered
11: on the x axis and parallels being circles centered on the y
12: axis. Find the intersection of the meridian thru (m,0), (90,0),
13: with the parallel thru (0,p), (p1,p2) */
14:
15: static int
16: twocircles(double m, double p, double p1, double p2, double *x, double *y)
17: {
18: double a; /* center of meridian circle, a>0 */
19: double b; /* center of parallel circle, b>0 */
20: double t,bb;
21: if(m > 0) {
22: twocircles(-m,p,p1,p2,x,y);
23: *x = -*x;
24: } else if(p < 0) {
25: twocircles(m,-p,p1,-p2,x,y);
26: *y = -*y;
27: } else if(p < .01) {
28: *x = m;
29: t = m/p1;
30: *y = p + (p2-p)*t*t;
31: } else if(m > -.01) {
32: *y = p;
33: *x = m - m*p*p;
34: } else {
35: b = p>=1? 1: p>.99? 0.5*(p+1 + p1*p1/(1-p)):
36: 0.5*(p*p-p1*p1-p2*p2)/(p-p2);
37: a = .5*(m - 1/m);
38: t = m*m-p*p+2*(b*p-a*m);
39: bb = b*b;
40: *x = quadratic(1+a*a/bb, -2*a + a*t/bb,
41: t*t/(4*bb) - m*m + 2*a*m);
42: *y = (*x*a+t/2)/b;
43: }
44: return 1;
45: }
46:
47: static int
48: Xglobular(struct place *place, double *x, double *y)
49: {
50: twocircles(-2*place->wlon.l/PI,
51: 2*place->nlat.l/PI, place->nlat.c, place->nlat.s, x, y);
52: return 1;
53: }
54:
55: proj
56: globular(void)
57: {
58: return Xglobular;
59: }
60:
61: static int
62: Xvandergrinten(struct place *place, double *x, double *y)
63: {
64: double t = 2*place->nlat.l/PI;
65: double abst = fabs(t);
66: double pval = abst>=1? 1: abst/(1+sqrt(1-t*t));
67: double p2 = 2*pval/(1+pval);
68: twocircles(-place->wlon.l/PI, pval, sqrt(1-p2*p2), p2, x, y);
69: if(t < 0)
70: *y = -*y;
71: return 1;
72: }
73:
74: proj
75: vandergrinten(void)
76: {
77: return Xvandergrinten;
78: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.