|
|
1.1 root 1: #include "map.h"
2:
3: static struct place gywhem, gyehem;
4: static struct coord gytwist;
5: static double gyconst, gykc, gyside;
6:
7:
8: static void
9: dosquare(double z1, double z2, double *x, double *y)
10: {
11: double w1,w2;
12: w1 = z1 -1;
13: if(fabs(w1*w1+z2*z2)>.000001) {
14: cdiv(z1+1,z2,w1,z2,&w1,&w2);
15: w1 *= gyconst;
16: w2 *= gyconst;
17: if(w1<0)
18: w1 = 0;
19: elco2(w1,w2,gykc,1.,1.,x,y);
20: } else {
21: *x = gyside;
22: *y = 0;
23: }
24: }
25:
26: int
27: Xguyou(struct place *place, double *x, double *y)
28: {
29: int ew; /*which hemisphere*/
30: double z1,z2;
31: struct place pl;
32: ew = place->wlon.l<0;
33: copyplace(place,&pl);
34: norm(&pl,ew?&gyehem:&gywhem,&gytwist);
35: Xstereographic(&pl,&z1,&z2);
36: dosquare(z1/2,z2/2,x,y);
37: if(!ew)
38: *x -= gyside;
39: return(1);
40: }
41:
42: proj
43: guyou(void)
44: {
45: double junk;
46: gykc = 1/(3+2*sqrt(2.));
47: gyconst = -(1+sqrt(2.));
48: elco2(-gyconst,0.,gykc,1.,1.,&gyside,&junk);
49: gyside *= 2;
50: latlon(0.,90.,&gywhem);
51: latlon(0.,-90.,&gyehem);
52: deg2rad(0.,&gytwist);
53: return(Xguyou);
54: }
55:
56: int
57: guycut(struct place *g, struct place *og, double *cutlon)
58: {
59: int c;
60: c = picut(g,og,cutlon);
61: if(c!=1)
62: return(c);
63: *cutlon = 0.;
64: if(g->nlat.c<.7071||og->nlat.c<.7071)
65: return(ckcut(g,og,0.));
66: return(1);
67: }
68:
69: static int
70: Xsquare(struct place *place, double *x, double *y)
71: {
72: double z1,z2;
73: double r, theta;
74: struct place p;
75: copyplace(place,&p);
76: if(place->nlat.l<0) {
77: p.nlat.l = -p.nlat.l;
78: p.nlat.s = -p.nlat.s;
79: }
80: if(p.nlat.l<FUZZ && fabs(p.wlon.l)>PI-FUZZ){
81: *y = -gyside/2;
82: *x = p.wlon.l>0?0:gyside;
83: return(1);
84: }
85: Xstereographic(&p,&z1,&z2);
86: r = sqrt(sqrt(hypot(z1,z2)/2));
87: theta = atan2(z1,-z2)/4;
88: dosquare(r*sin(theta),-r*cos(theta),x,y);
89: if(place->nlat.l<0)
90: *y = -gyside - *y;
91: return(1);
92: }
93:
94: proj
95: square(void)
96: {
97: guyou();
98: return(Xsquare);
99: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.