Blob


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