xref: /plan9/sys/src/cmd/map/map.h (revision 59cc4ca53493a3c6d2349fe2b7f7c40f7dce7294)
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