62 lines
1.5 KiB
C
62 lines
1.5 KiB
C
#include <u.h>
|
|
#include <libc.h>
|
|
#include "map.h"
|
|
|
|
int Xstereographic(struct place *place, double *x, double *y);
|
|
|
|
static struct place eastpole;
|
|
static struct place westpole;
|
|
static double eastx, easty;
|
|
static double westx, westy;
|
|
static double scale;
|
|
static double pwr;
|
|
|
|
/* conformal map w = ((1+z)^A - (1-z)^A)/((1+z)^A + (1-z)^A),
|
|
where A<1, maps unit circle onto a convex lune with x= +-1
|
|
mapping to vertices of angle A*PI at w = +-1 */
|
|
|
|
/* there are cuts from E and W poles to S pole,
|
|
in absence of a cut routine, error is returned for
|
|
points outside a polar cap through E and W poles */
|
|
|
|
static int Xlune(struct place *place, double *x, double *y)
|
|
{
|
|
double stereox, stereoy;
|
|
double z1x, z1y, z2x, z2y;
|
|
double w1x, w1y, w2x, w2y;
|
|
double numx, numy, denx, deny;
|
|
if(place->nlat.l < eastpole.nlat.l-FUZZ)
|
|
return -1;
|
|
Xstereographic(place, &stereox, &stereoy);
|
|
stereox *= scale;
|
|
stereoy *= scale;
|
|
z1x = 1 + stereox;
|
|
z1y = stereoy;
|
|
z2x = 1 - stereox;
|
|
z2y = -stereoy;
|
|
cpow(z1x,z1y,&w1x,&w1y,pwr);
|
|
cpow(z2x,z2y,&w2x,&w2y,pwr);
|
|
numx = w1x - w2x;
|
|
numy = w1y - w2y;
|
|
denx = w1x + w2x;
|
|
deny = w1y + w2y;
|
|
cdiv(numx, numy, denx, deny, x, y);
|
|
return 1;
|
|
}
|
|
|
|
proj
|
|
lune(double lat, double theta)
|
|
{
|
|
deg2rad(lat, &eastpole.nlat);
|
|
deg2rad(-90.,&eastpole.wlon);
|
|
deg2rad(lat, &westpole.nlat);
|
|
deg2rad(90. ,&westpole.wlon);
|
|
Xstereographic(&eastpole, &eastx, &easty);
|
|
Xstereographic(&westpole, &westx, &westy);
|
|
if(fabs(easty)>FUZZ || fabs(westy)>FUZZ ||
|
|
fabs(eastx+westx)>FUZZ)
|
|
abort();
|
|
scale = 1/eastx;
|
|
pwr = theta/180;
|
|
return Xlune;
|
|
}
|