1*59cc4ca5SDavid du Colombier #pragma lib "/sys/src/cmd/map/libmap/libmap.a$O" 2*59cc4ca5SDavid du Colombier #pragma src "/sys/src/cmd/map/libmap" 33e12c5d1SDavid du Colombier 43e12c5d1SDavid du Colombier #ifndef PI 53e12c5d1SDavid du Colombier #define PI 3.1415926535897932384626433832795028841971693993751 63e12c5d1SDavid du Colombier #endif 73e12c5d1SDavid du Colombier 83e12c5d1SDavid du Colombier #define TWOPI (2*PI) 93e12c5d1SDavid du Colombier #define RAD (PI/180) 103e12c5d1SDavid du Colombier double hypot(double, double); /* sqrt(a*a+b*b) */ 113e12c5d1SDavid du Colombier double tan(double); /* not in K&R library */ 123e12c5d1SDavid du Colombier 133e12c5d1SDavid du Colombier #define ECC .08227185422 /* eccentricity of earth */ 143e12c5d1SDavid du Colombier #define EC2 .006768657997 153e12c5d1SDavid du Colombier 163e12c5d1SDavid du Colombier #define FUZZ .0001 17219b2ee8SDavid du Colombier #define UNUSED 0.0 /* a dummy double parameter */ 183e12c5d1SDavid du Colombier 193e12c5d1SDavid du Colombier struct coord { 20219b2ee8SDavid du Colombier double l; /* lat or lon in radians*/ 21219b2ee8SDavid du Colombier double s; /* sin */ 22219b2ee8SDavid du Colombier double c; /* cos */ 233e12c5d1SDavid du Colombier }; 243e12c5d1SDavid du Colombier struct place { 253e12c5d1SDavid du Colombier struct coord nlat; 263e12c5d1SDavid du Colombier struct coord wlon; 273e12c5d1SDavid du Colombier }; 283e12c5d1SDavid du Colombier 29219b2ee8SDavid du Colombier typedef int (*proj)(struct place *, double *, double *); 303e12c5d1SDavid du Colombier 313e12c5d1SDavid du Colombier struct index { /* index of known projections */ 323e12c5d1SDavid du Colombier char *name; /* name of projection */ 33219b2ee8SDavid du Colombier proj (*prog)(double, double); 343e12c5d1SDavid du Colombier /* pointer to projection function */ 353e12c5d1SDavid du Colombier int npar; /* number of params */ 36219b2ee8SDavid du Colombier int (*cut)(struct place *, struct place *, double *); 373e12c5d1SDavid du Colombier /* function that handles cuts--eg longitude 180 */ 383e12c5d1SDavid du Colombier int poles; /*1 S pole is a line, 2 N pole is, 3 both*/ 393e12c5d1SDavid du Colombier int spheroid; /* poles must be at 90 deg if nonzero */ 40219b2ee8SDavid du Colombier int (*limb)(double *lat, double *lon, double resolution); 41219b2ee8SDavid du Colombier /* get next place on limb */ 42219b2ee8SDavid du Colombier /* return -1 if done, 0 at gap, else 1 */ 433e12c5d1SDavid du Colombier }; 443e12c5d1SDavid du Colombier 453e12c5d1SDavid du Colombier 463e12c5d1SDavid du Colombier proj aitoff(void); 47219b2ee8SDavid du Colombier proj albers(double, double); 48219b2ee8SDavid du Colombier int Xazequalarea(struct place *, double *, double *); 493e12c5d1SDavid du Colombier proj azequalarea(void); 50219b2ee8SDavid du Colombier int Xazequidistant(struct place *, double *, double *); 513e12c5d1SDavid du Colombier proj azequidistant(void); 52219b2ee8SDavid du Colombier proj bicentric(double); 53219b2ee8SDavid du Colombier proj bonne(double); 54219b2ee8SDavid du Colombier proj conic(double); 55219b2ee8SDavid du Colombier proj cylequalarea(double); 56219b2ee8SDavid du Colombier int Xcylindrical(struct place *, double *, double *); 573e12c5d1SDavid du Colombier proj cylindrical(void); 58219b2ee8SDavid du Colombier proj elliptic(double); 59219b2ee8SDavid du Colombier proj fisheye(double); 60219b2ee8SDavid du Colombier proj gall(double); 61219b2ee8SDavid du Colombier proj gilbert(void); 623e12c5d1SDavid du Colombier proj globular(void); 633e12c5d1SDavid du Colombier proj gnomonic(void); 64219b2ee8SDavid du Colombier int guycut(struct place *, struct place *, double *); 65219b2ee8SDavid du Colombier int Xguyou(struct place *, double *, double *); 663e12c5d1SDavid du Colombier proj guyou(void); 67219b2ee8SDavid du Colombier proj harrison(double, double); 68219b2ee8SDavid du Colombier int hexcut(struct place *, struct place *, double *); 693e12c5d1SDavid du Colombier proj hex(void); 70219b2ee8SDavid du Colombier proj homing(double); 71219b2ee8SDavid du Colombier int hlimb(double*, double*, double resolution); 723e12c5d1SDavid du Colombier proj lagrange(void); 73219b2ee8SDavid du Colombier proj lambert(double, double); 743e12c5d1SDavid du Colombier proj laue(void); 757dd7cddfSDavid du Colombier proj lune(double, double); 76219b2ee8SDavid du Colombier proj loxodromic(double); /* not in library */ 77219b2ee8SDavid du Colombier proj mecca(double); 78219b2ee8SDavid du Colombier int mlimb(double*, double*, double resolution); 793e12c5d1SDavid du Colombier proj mercator(void); 803e12c5d1SDavid du Colombier proj mollweide(void); 81219b2ee8SDavid du Colombier proj newyorker(double); 82219b2ee8SDavid du Colombier proj ortelius(double, double); /* not in library */ 83219b2ee8SDavid du Colombier int Xorthographic(struct place *place, double *x, double *y); 843e12c5d1SDavid du Colombier proj orthographic(void); 85219b2ee8SDavid du Colombier int olimb(double*, double*, double); 86219b2ee8SDavid du Colombier proj perspective(double); 87219b2ee8SDavid du Colombier int plimb(double*, double*, double resolution); 88219b2ee8SDavid du Colombier int Xpolyconic(struct place *, double *, double *); 893e12c5d1SDavid du Colombier proj polyconic(void); 90219b2ee8SDavid du Colombier proj rectangular(double); 91219b2ee8SDavid du Colombier proj simpleconic(double, double); 92219b2ee8SDavid du Colombier int Xsinusoidal(struct place *, double *, double *); 933e12c5d1SDavid du Colombier proj sinusoidal(void); 94219b2ee8SDavid du Colombier proj sp_albers(double, double); 953e12c5d1SDavid du Colombier proj sp_mercator(void); 963e12c5d1SDavid du Colombier proj square(void); 97219b2ee8SDavid du Colombier int Xstereographic(struct place *, double *, double *); 983e12c5d1SDavid du Colombier proj stereographic(void); 99219b2ee8SDavid du Colombier int Xtetra(struct place *, double *, double *); 100219b2ee8SDavid du Colombier int tetracut(struct place *, struct place *, double *); 1013e12c5d1SDavid du Colombier proj tetra(void); 102219b2ee8SDavid du Colombier proj trapezoidal(double, double); 1033e12c5d1SDavid du Colombier proj vandergrinten(void); 104219b2ee8SDavid du Colombier proj wreath(double, double); /* not in library */ 1053e12c5d1SDavid du Colombier 1063e12c5d1SDavid du Colombier void findxy(double, double *, double *); 107219b2ee8SDavid du Colombier void albscale(double, double, double, double); 108219b2ee8SDavid du Colombier void invalb(double, double, double *, double *); 1093e12c5d1SDavid du Colombier 1103e12c5d1SDavid du Colombier void cdiv(double, double, double, double, double *, double *); 1113e12c5d1SDavid du Colombier void cmul(double, double, double, double, double *, double *); 1127dd7cddfSDavid du Colombier void cpow(double, double, double *, double *, double); 1133e12c5d1SDavid du Colombier void csq(double, double, double *, double *); 1143e12c5d1SDavid du Colombier void csqrt(double, double, double *, double *); 1153e12c5d1SDavid du Colombier void ccubrt(double, double, double *, double *); 1163e12c5d1SDavid du Colombier double cubrt(double); 117219b2ee8SDavid du Colombier int elco2(double, double, double, double, double, double *, double *); 1183e12c5d1SDavid du Colombier void cdiv2(double, double, double, double, double *, double *); 1193e12c5d1SDavid du Colombier void csqr(double, double, double *, double *); 1203e12c5d1SDavid du Colombier 121219b2ee8SDavid du Colombier void orient(double, double, double); 122219b2ee8SDavid du Colombier void latlon(double, double, struct place *); 123219b2ee8SDavid du Colombier void deg2rad(double, struct coord *); 1243e12c5d1SDavid du Colombier void sincos(struct coord *); 1253e12c5d1SDavid du Colombier void normalize(struct place *); 1263e12c5d1SDavid du Colombier void invert(struct place *); 1273e12c5d1SDavid du Colombier void norm(struct place *, struct place *, struct coord *); 1283e12c5d1SDavid du Colombier void printp(struct place *); 1293e12c5d1SDavid du Colombier void copyplace(struct place *, struct place *); 1303e12c5d1SDavid du Colombier 131219b2ee8SDavid du Colombier int picut(struct place *, struct place *, double *); 132219b2ee8SDavid du Colombier int ckcut(struct place *, struct place *, double); 133219b2ee8SDavid du Colombier double reduce(double); 1343e12c5d1SDavid du Colombier 1353e12c5d1SDavid du Colombier void getsyms(char *); 1363e12c5d1SDavid du Colombier int putsym(struct place *, char *, double, int); 1373e12c5d1SDavid du Colombier void filerror(char *s, char *f); 1383e12c5d1SDavid du Colombier void error(char *s); 1393e12c5d1SDavid du Colombier int doproj(struct place *, int *, int *); 1403e12c5d1SDavid du Colombier int cpoint(int, int, int); 1413e12c5d1SDavid du Colombier int plotpt(struct place *, int); 142219b2ee8SDavid du Colombier int nocut(struct place *, struct place *, double *); 1433e12c5d1SDavid du Colombier 144219b2ee8SDavid du Colombier extern int (*projection)(struct place *, double *, double *); 145