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