xref: /plan9/sys/src/cmd/map/libmap/mercator.c (revision 59cc4ca53493a3c6d2349fe2b7f7c40f7dce7294)
1*59cc4ca5SDavid du Colombier #include <u.h>
2*59cc4ca5SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include "map.h"
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier static int
Xmercator(struct place * place,double * x,double * y)6219b2ee8SDavid du Colombier Xmercator(struct place *place, double *x, double *y)
73e12c5d1SDavid du Colombier {
83e12c5d1SDavid du Colombier 	if(fabs(place->nlat.l) > 80.*RAD)
93e12c5d1SDavid du Colombier 		return(-1);
103e12c5d1SDavid du Colombier 	*x = -place->wlon.l;
113e12c5d1SDavid du Colombier 	*y = 0.5*log((1+place->nlat.s)/(1-place->nlat.s));
123e12c5d1SDavid du Colombier 	return(1);
133e12c5d1SDavid du Colombier }
143e12c5d1SDavid du Colombier 
153e12c5d1SDavid du Colombier proj
mercator(void)163e12c5d1SDavid du Colombier mercator(void)
173e12c5d1SDavid du Colombier {
183e12c5d1SDavid du Colombier 	return(Xmercator);
193e12c5d1SDavid du Colombier }
203e12c5d1SDavid du Colombier 
21219b2ee8SDavid du Colombier static double ecc = ECC;
223e12c5d1SDavid du Colombier 
233e12c5d1SDavid du Colombier static int
Xspmercator(struct place * place,double * x,double * y)24219b2ee8SDavid du Colombier Xspmercator(struct place *place, double *x, double *y)
253e12c5d1SDavid du Colombier {
263e12c5d1SDavid du Colombier 	if(Xmercator(place,x,y) < 0)
273e12c5d1SDavid du Colombier 		return(-1);
283e12c5d1SDavid du Colombier 	*y += 0.5*ecc*log((1-ecc*place->nlat.s)/(1+ecc*place->nlat.s));
293e12c5d1SDavid du Colombier 	return(1);
303e12c5d1SDavid du Colombier }
313e12c5d1SDavid du Colombier 
323e12c5d1SDavid du Colombier proj
sp_mercator(void)333e12c5d1SDavid du Colombier sp_mercator(void)
343e12c5d1SDavid du Colombier {
353e12c5d1SDavid du Colombier 	return(Xspmercator);
363e12c5d1SDavid du Colombier }
37