Blob
1 #include <u.h>2 #include <libc.h>3 #include "map.h"5 #define ORTHRAD 10006 static double viewpt;8 static int9 Xperspective(struct place *place, double *x, double *y)10 {11 double r;12 if(viewpt<=1+FUZZ && fabs(place->nlat.s)<=viewpt+.01)13 return(-1);14 r = place->nlat.c*(viewpt - 1.)/(viewpt - place->nlat.s);15 *x = - r*place->wlon.s;16 *y = - r*place->wlon.c;17 if(r>4.)18 return(-1);19 if(fabs(viewpt)>1 && place->nlat.s<1/viewpt ||20 fabs(viewpt)<=1 && place->nlat.s<viewpt)21 return 0;22 return(1);23 }25 proj26 perspective(double radius)27 {28 viewpt = radius;29 if(viewpt >= ORTHRAD)30 return(Xorthographic);31 if(fabs(viewpt-1.)<.0001)32 return(0);33 return(Xperspective);34 }36 /* called from various conformal projections,37 but not from stereographic itself */38 int39 Xstereographic(struct place *place, double *x, double *y)40 {41 double v = viewpt;42 int retval;43 viewpt = -1;44 retval = Xperspective(place, x, y);45 viewpt = v;46 return retval;47 }49 proj50 stereographic(void)51 {52 viewpt = -1.;53 return(Xperspective);54 }56 proj57 gnomonic(void)58 {59 viewpt = 0.;60 return(Xperspective);61 }63 int64 plimb(double *lat, double *lon, double res)65 {66 static int first = 1;67 if(viewpt >= ORTHRAD)68 return olimb(lat, lon, res);69 if(first) {70 first = 0;71 *lon = -180;72 if(fabs(viewpt) < .01)73 *lat = 0;74 else if(fabs(viewpt)<=1)75 *lat = asin(viewpt)/RAD;76 else77 *lat = asin(1/viewpt)/RAD;78 } else79 *lon += res;80 if(*lon <= 180)81 return 1;82 first = 1;83 return -1;84 }