| /* |
| #pragma lib "/sys/src/cmd/map/libmap/libmap.a$O" |
| #pragma src "/sys/src/cmd/map/libmap" |
| */ |
| |
| #define index index0 |
| #ifndef PI |
| #define PI 3.1415926535897932384626433832795028841971693993751 |
| #endif |
| |
| #define TWOPI (2*PI) |
| #define RAD (PI/180) |
| double hypot(double, double); /* sqrt(a*a+b*b) */ |
| double tan(double); /* not in K&R library */ |
| |
| #define ECC .08227185422 /* eccentricity of earth */ |
| #define EC2 .006768657997 |
| |
| #define FUZZ .0001 |
| #define UNUSED 0.0 /* a dummy double parameter */ |
| |
| struct coord { |
| double l; /* lat or lon in radians*/ |
| double s; /* sin */ |
| double c; /* cos */ |
| }; |
| struct place { |
| struct coord nlat; |
| struct coord wlon; |
| }; |
| |
| typedef int (*proj)(struct place *, double *, double *); |
| |
| struct index { /* index of known projections */ |
| char *name; /* name of projection */ |
| proj (*prog)(double, double); |
| /* pointer to projection function */ |
| int npar; /* number of params */ |
| int (*cut)(struct place *, struct place *, double *); |
| /* function that handles cuts--eg longitude 180 */ |
| int poles; /*1 S pole is a line, 2 N pole is, 3 both*/ |
| int spheroid; /* poles must be at 90 deg if nonzero */ |
| int (*limb)(double *lat, double *lon, double resolution); |
| /* get next place on limb */ |
| /* return -1 if done, 0 at gap, else 1 */ |
| }; |
| |
| |
| proj aitoff(void); |
| proj albers(double, double); |
| int Xazequalarea(struct place *, double *, double *); |
| proj azequalarea(void); |
| int Xazequidistant(struct place *, double *, double *); |
| proj azequidistant(void); |
| proj bicentric(double); |
| proj bonne(double); |
| proj conic(double); |
| proj cylequalarea(double); |
| int Xcylindrical(struct place *, double *, double *); |
| proj cylindrical(void); |
| proj elliptic(double); |
| proj fisheye(double); |
| proj gall(double); |
| proj gilbert(void); |
| proj globular(void); |
| proj gnomonic(void); |
| int guycut(struct place *, struct place *, double *); |
| int Xguyou(struct place *, double *, double *); |
| proj guyou(void); |
| proj harrison(double, double); |
| int hexcut(struct place *, struct place *, double *); |
| proj hex(void); |
| proj homing(double); |
| int hlimb(double*, double*, double resolution); |
| proj lagrange(void); |
| proj lambert(double, double); |
| proj laue(void); |
| proj lune(double, double); |
| proj loxodromic(double); /* not in library */ |
| proj mecca(double); |
| int mlimb(double*, double*, double resolution); |
| proj mercator(void); |
| proj mollweide(void); |
| proj newyorker(double); |
| proj ortelius(double, double); /* not in library */ |
| int Xorthographic(struct place *place, double *x, double *y); |
| proj orthographic(void); |
| int olimb(double*, double*, double); |
| proj perspective(double); |
| int plimb(double*, double*, double resolution); |
| int Xpolyconic(struct place *, double *, double *); |
| proj polyconic(void); |
| proj rectangular(double); |
| proj simpleconic(double, double); |
| int Xsinusoidal(struct place *, double *, double *); |
| proj sinusoidal(void); |
| proj sp_albers(double, double); |
| proj sp_mercator(void); |
| proj square(void); |
| int Xstereographic(struct place *, double *, double *); |
| proj stereographic(void); |
| int Xtetra(struct place *, double *, double *); |
| int tetracut(struct place *, struct place *, double *); |
| proj tetra(void); |
| proj trapezoidal(double, double); |
| proj vandergrinten(void); |
| proj wreath(double, double); /* not in library */ |
| |
| void findxy(double, double *, double *); |
| void albscale(double, double, double, double); |
| void invalb(double, double, double *, double *); |
| |
| #define csqrt map_csqrt /* conflicts on FreeBSD 5 with gcc builtins */ |
| #define cpow map_cpow |
| #define sincos map_sincos |
| |
| void cdiv(double, double, double, double, double *, double *); |
| void cmul(double, double, double, double, double *, double *); |
| void cpow(double, double, double *, double *, double); |
| void csq(double, double, double *, double *); |
| void csqrt(double, double, double *, double *); |
| void ccubrt(double, double, double *, double *); |
| double cubrt(double); |
| int elco2(double, double, double, double, double, double *, double *); |
| void cdiv2(double, double, double, double, double *, double *); |
| void csqr(double, double, double *, double *); |
| |
| void orient(double, double, double); |
| void latlon(double, double, struct place *); |
| void deg2rad(double, struct coord *); |
| void sincos(struct coord *); |
| void normalize(struct place *); |
| void invert(struct place *); |
| void norm(struct place *, struct place *, struct coord *); |
| void printp(struct place *); |
| void copyplace(struct place *, struct place *); |
| |
| int picut(struct place *, struct place *, double *); |
| int ckcut(struct place *, struct place *, double); |
| double reduce(double); |
| |
| void getsyms(char *); |
| int putsym(struct place *, char *, double, int); |
| void filerror(char *s, char *f); |
| void error(char *s); |
| int doproj(struct place *, int *, int *); |
| int cpoint(int, int, int); |
| int plotpt(struct place *, int); |
| int nocut(struct place *, struct place *, double *); |
| |
| extern int (*projection)(struct place *, double *, double *); |