1 #pragma lib "/sys/src/cmd/map/libmap/libmap.a$O" 2 #pragma src "/sys/src/cmd/map/libmap" 3 4 #ifndef PI 5 #define PI 3.1415926535897932384626433832795028841971693993751 6 #endif 7 8 #define TWOPI (2*PI) 9 #define RAD (PI/180) 10 double hypot(double, double); /* sqrt(a*a+b*b) */ 11 double tan(double); /* not in K&R library */ 12 13 #define ECC .08227185422 /* eccentricity of earth */ 14 #define EC2 .006768657997 15 16 #define FUZZ .0001 17 #define UNUSED 0.0 /* a dummy double parameter */ 18 19 struct coord { 20 double l; /* lat or lon in radians*/ 21 double s; /* sin */ 22 double c; /* cos */ 23 }; 24 struct place { 25 struct coord nlat; 26 struct coord wlon; 27 }; 28 29 typedef int (*proj)(struct place *, double *, double *); 30 31 struct index { /* index of known projections */ 32 char *name; /* name of projection */ 33 proj (*prog)(double, double); 34 /* pointer to projection function */ 35 int npar; /* number of params */ 36 int (*cut)(struct place *, struct place *, double *); 37 /* function that handles cuts--eg longitude 180 */ 38 int poles; /*1 S pole is a line, 2 N pole is, 3 both*/ 39 int spheroid; /* poles must be at 90 deg if nonzero */ 40 int (*limb)(double *lat, double *lon, double resolution); 41 /* get next place on limb */ 42 /* return -1 if done, 0 at gap, else 1 */ 43 }; 44 45 46 proj aitoff(void); 47 proj albers(double, double); 48 int Xazequalarea(struct place *, double *, double *); 49 proj azequalarea(void); 50 int Xazequidistant(struct place *, double *, double *); 51 proj azequidistant(void); 52 proj bicentric(double); 53 proj bonne(double); 54 proj conic(double); 55 proj cylequalarea(double); 56 int Xcylindrical(struct place *, double *, double *); 57 proj cylindrical(void); 58 proj elliptic(double); 59 proj fisheye(double); 60 proj gall(double); 61 proj gilbert(void); 62 proj globular(void); 63 proj gnomonic(void); 64 int guycut(struct place *, struct place *, double *); 65 int Xguyou(struct place *, double *, double *); 66 proj guyou(void); 67 proj harrison(double, double); 68 int hexcut(struct place *, struct place *, double *); 69 proj hex(void); 70 proj homing(double); 71 int hlimb(double*, double*, double resolution); 72 proj lagrange(void); 73 proj lambert(double, double); 74 proj laue(void); 75 proj lune(double, double); 76 proj loxodromic(double); /* not in library */ 77 proj mecca(double); 78 int mlimb(double*, double*, double resolution); 79 proj mercator(void); 80 proj mollweide(void); 81 proj newyorker(double); 82 proj ortelius(double, double); /* not in library */ 83 int Xorthographic(struct place *place, double *x, double *y); 84 proj orthographic(void); 85 int olimb(double*, double*, double); 86 proj perspective(double); 87 int plimb(double*, double*, double resolution); 88 int Xpolyconic(struct place *, double *, double *); 89 proj polyconic(void); 90 proj rectangular(double); 91 proj simpleconic(double, double); 92 int Xsinusoidal(struct place *, double *, double *); 93 proj sinusoidal(void); 94 proj sp_albers(double, double); 95 proj sp_mercator(void); 96 proj square(void); 97 int Xstereographic(struct place *, double *, double *); 98 proj stereographic(void); 99 int Xtetra(struct place *, double *, double *); 100 int tetracut(struct place *, struct place *, double *); 101 proj tetra(void); 102 proj trapezoidal(double, double); 103 proj vandergrinten(void); 104 proj wreath(double, double); /* not in library */ 105 106 void findxy(double, double *, double *); 107 void albscale(double, double, double, double); 108 void invalb(double, double, double *, double *); 109 110 void cdiv(double, double, double, double, double *, double *); 111 void cmul(double, double, double, double, double *, double *); 112 void cpow(double, double, double *, double *, double); 113 void csq(double, double, double *, double *); 114 void csqrt(double, double, double *, double *); 115 void ccubrt(double, double, double *, double *); 116 double cubrt(double); 117 int elco2(double, double, double, double, double, double *, double *); 118 void cdiv2(double, double, double, double, double *, double *); 119 void csqr(double, double, double *, double *); 120 121 void orient(double, double, double); 122 void latlon(double, double, struct place *); 123 void deg2rad(double, struct coord *); 124 void sincos(struct coord *); 125 void normalize(struct place *); 126 void invert(struct place *); 127 void norm(struct place *, struct place *, struct coord *); 128 void printp(struct place *); 129 void copyplace(struct place *, struct place *); 130 131 int picut(struct place *, struct place *, double *); 132 int ckcut(struct place *, struct place *, double); 133 double reduce(double); 134 135 void getsyms(char *); 136 int putsym(struct place *, char *, double, int); 137 void filerror(char *s, char *f); 138 void error(char *s); 139 int doproj(struct place *, int *, int *); 140 int cpoint(int, int, int); 141 int plotpt(struct place *, int); 142 int nocut(struct place *, struct place *, double *); 143 144 extern int (*projection)(struct place *, double *, double *); 145