85 lines
1.4 KiB
C
85 lines
1.4 KiB
C
#include <u.h>
|
|
#include <libc.h>
|
|
#include "map.h"
|
|
|
|
#define ORTHRAD 1000
|
|
static double viewpt;
|
|
|
|
static int
|
|
Xperspective(struct place *place, double *x, double *y)
|
|
{
|
|
double r;
|
|
if(viewpt<=1+FUZZ && fabs(place->nlat.s<=viewpt+.01))
|
|
return(-1);
|
|
r = place->nlat.c*(viewpt - 1.)/(viewpt - place->nlat.s);
|
|
*x = - r*place->wlon.s;
|
|
*y = - r*place->wlon.c;
|
|
if(r>4.)
|
|
return(-1);
|
|
if(fabs(viewpt)>1 && place->nlat.s<1/viewpt ||
|
|
fabs(viewpt)<=1 && place->nlat.s<viewpt)
|
|
return 0;
|
|
return(1);
|
|
}
|
|
|
|
proj
|
|
perspective(double radius)
|
|
{
|
|
viewpt = radius;
|
|
if(viewpt >= ORTHRAD)
|
|
return(Xorthographic);
|
|
if(fabs(viewpt-1.)<.0001)
|
|
return(0);
|
|
return(Xperspective);
|
|
}
|
|
|
|
/* called from various conformal projections,
|
|
but not from stereographic itself */
|
|
int
|
|
Xstereographic(struct place *place, double *x, double *y)
|
|
{
|
|
double v = viewpt;
|
|
int retval;
|
|
viewpt = -1;
|
|
retval = Xperspective(place, x, y);
|
|
viewpt = v;
|
|
return retval;
|
|
}
|
|
|
|
proj
|
|
stereographic(void)
|
|
{
|
|
viewpt = -1.;
|
|
return(Xperspective);
|
|
}
|
|
|
|
proj
|
|
gnomonic(void)
|
|
{
|
|
viewpt = 0.;
|
|
return(Xperspective);
|
|
}
|
|
|
|
int
|
|
plimb(double *lat, double *lon, double res)
|
|
{
|
|
static int first = 1;
|
|
if(viewpt >= ORTHRAD)
|
|
return olimb(lat, lon, res);
|
|
if(first) {
|
|
first = 0;
|
|
*lon = -180;
|
|
if(fabs(viewpt) < .01)
|
|
*lat = 0;
|
|
else if(fabs(viewpt)<=1)
|
|
*lat = asin(viewpt)/RAD;
|
|
else
|
|
*lat = asin(1/viewpt)/RAD;
|
|
} else
|
|
*lon += res;
|
|
if(*lon <= 180)
|
|
return 1;
|
|
first = 1;
|
|
return -1;
|
|
}
|