102 lines
1.7 KiB
C
102 lines
1.7 KiB
C
#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);
|
|
}
|