| #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); | 
 | } |