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