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