| #include <u.h> |
| #include <libc.h> |
| #include "map.h" |
| |
| static struct place gywhem, gyehem; |
| static struct coord gytwist; |
| static double gyconst, gykc, gyside; |
| |
| |
| static void |
| dosquare(double z1, double z2, double *x, double *y) |
| { |
| double w1,w2; |
| w1 = z1 -1; |
| if(fabs(w1*w1+z2*z2)>.000001) { |
| cdiv(z1+1,z2,w1,z2,&w1,&w2); |
| w1 *= gyconst; |
| w2 *= gyconst; |
| if(w1<0) |
| w1 = 0; |
| elco2(w1,w2,gykc,1.,1.,x,y); |
| } else { |
| *x = gyside; |
| *y = 0; |
| } |
| } |
| |
| int |
| Xguyou(struct place *place, double *x, double *y) |
| { |
| int ew; /*which hemisphere*/ |
| double z1,z2; |
| struct place pl; |
| ew = place->wlon.l<0; |
| copyplace(place,&pl); |
| norm(&pl,ew?&gyehem:&gywhem,&gytwist); |
| Xstereographic(&pl,&z1,&z2); |
| dosquare(z1/2,z2/2,x,y); |
| if(!ew) |
| *x -= gyside; |
| return(1); |
| } |
| |
| proj |
| guyou(void) |
| { |
| double junk; |
| gykc = 1/(3+2*sqrt(2.)); |
| gyconst = -(1+sqrt(2.)); |
| elco2(-gyconst,0.,gykc,1.,1.,&gyside,&junk); |
| gyside *= 2; |
| latlon(0.,90.,&gywhem); |
| latlon(0.,-90.,&gyehem); |
| deg2rad(0.,&gytwist); |
| return(Xguyou); |
| } |
| |
| int |
| guycut(struct place *g, struct place *og, double *cutlon) |
| { |
| int c; |
| c = picut(g,og,cutlon); |
| if(c!=1) |
| return(c); |
| *cutlon = 0.; |
| if(g->nlat.c<.7071||og->nlat.c<.7071) |
| return(ckcut(g,og,0.)); |
| return(1); |
| } |
| |
| static int |
| Xsquare(struct place *place, double *x, double *y) |
| { |
| double z1,z2; |
| double r, theta; |
| struct place p; |
| copyplace(place,&p); |
| if(place->nlat.l<0) { |
| p.nlat.l = -p.nlat.l; |
| p.nlat.s = -p.nlat.s; |
| } |
| if(p.nlat.l<FUZZ && fabs(p.wlon.l)>PI-FUZZ){ |
| *y = -gyside/2; |
| *x = p.wlon.l>0?0:gyside; |
| return(1); |
| } |
| Xstereographic(&p,&z1,&z2); |
| r = sqrt(sqrt(hypot(z1,z2)/2)); |
| theta = atan2(z1,-z2)/4; |
| dosquare(r*sin(theta),-r*cos(theta),x,y); |
| if(place->nlat.l<0) |
| *y = -gyside - *y; |
| return(1); |
| } |
| |
| proj |
| square(void) |
| { |
| guyou(); |
| return(Xsquare); |
| } |