Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#pragma lib     "/sys/src/cmd/map/libmap/libmap.a$O"
#pragma src     "/sys/src/cmd/map/libmap"

#ifndef PI
#define PI      3.1415926535897932384626433832795028841971693993751
#endif

#define TWOPI (2*PI)
#define RAD (PI/180)
double  hypot(double, double);  /* sqrt(a*a+b*b) */
double  tan(double);            /* not in K&R library */

#define ECC .08227185422        /* eccentricity of earth */
#define EC2 .006768657997

#define FUZZ .0001
#define UNUSED 0.0              /* a dummy double parameter */

struct coord {
        double l;       /* lat or lon in radians*/
        double s;       /* sin */
        double c;       /* cos */
};
struct place {
        struct coord nlat;
        struct coord wlon;
};

typedef int (*proj)(struct place *, double *, double *);

struct index {          /* index of known projections */
        char *name;     /* name of projection */
        proj (*prog)(double, double);
                        /* pointer to projection function */
        int npar;       /* number of params */
        int (*cut)(struct place *, struct place *, double *);
                        /* function that handles cuts--eg longitude 180 */
        int poles;      /*1 S pole is a line, 2 N pole is, 3 both*/
        int spheroid;   /* poles must be at 90 deg if nonzero */
        int (*limb)(double *lat, double *lon, double resolution);
                        /* get next place on limb */
                        /* return -1 if done, 0 at gap, else 1 */
};


proj    aitoff(void);
proj    albers(double, double);
int     Xazequalarea(struct place *, double *, double *);
proj    azequalarea(void);
int     Xazequidistant(struct place *, double *, double *);
proj    azequidistant(void);
proj    bicentric(double);
proj    bonne(double);
proj    conic(double);
proj    cylequalarea(double);
int     Xcylindrical(struct place *, double *, double *);
proj    cylindrical(void);
proj    elliptic(double);
proj    fisheye(double);
proj    gall(double);
proj    gilbert(void);
proj    globular(void);
proj    gnomonic(void);
int     guycut(struct place *, struct place *, double *);
int     Xguyou(struct place *, double *, double *);
proj    guyou(void);
proj    harrison(double, double);
int     hexcut(struct place *, struct place *, double *);
proj    hex(void);
proj    homing(double);
int     hlimb(double*, double*, double resolution);
proj    lagrange(void);
proj    lambert(double, double);
proj    laue(void);
proj    lune(double, double);
proj    loxodromic(double);     /* not in library */
proj    mecca(double);
int     mlimb(double*, double*, double resolution);
proj    mercator(void);
proj    mollweide(void);
proj    newyorker(double);
proj    ortelius(double, double);       /* not in library */
int     Xorthographic(struct place *place, double *x, double *y);
proj    orthographic(void);
int     olimb(double*, double*, double);
proj    perspective(double);
int     plimb(double*, double*, double resolution);
int     Xpolyconic(struct place *, double *, double *);
proj    polyconic(void);
proj    rectangular(double);
proj    simpleconic(double, double);
int     Xsinusoidal(struct place *, double *, double *);
proj    sinusoidal(void);
proj    sp_albers(double, double);
proj    sp_mercator(void);
proj    square(void);
int     Xstereographic(struct place *, double *, double *);
proj    stereographic(void);
int     Xtetra(struct place *, double *, double *);
int     tetracut(struct place *, struct place *, double *);
proj    tetra(void);
proj    trapezoidal(double, double);
proj    vandergrinten(void);
proj    wreath(double, double); /* not in library */

void    findxy(double, double *, double *);
void    albscale(double, double, double, double);
void    invalb(double, double, double *, double *);

void    cdiv(double, double, double, double, double *, double *);
void    cmul(double, double, double, double, double *, double *);
void    cpow(double, double, double *, double *, double);
void    csq(double, double, double *, double *);
void    csqrt(double, double, double *, double *);
void    ccubrt(double, double, double *, double *);
double  cubrt(double);
int     elco2(double, double, double, double, double, double *, double *);
void    cdiv2(double, double, double, double, double *, double *);
void    csqr(double, double, double *, double *);

void    orient(double, double, double);
void    latlon(double, double, struct place *);
void    deg2rad(double, struct coord *);
void    sincos(struct coord *);
void    normalize(struct place *);
void    invert(struct place *);
void    norm(struct place *, struct place *, struct coord *);
void    printp(struct place *);
void    copyplace(struct place *, struct place *);

int     picut(struct place *, struct place *, double *);
int     ckcut(struct place *, struct place *, double);
double  reduce(double);

void    getsyms(char *);
int     putsym(struct place *, char *, double, int);
void    filerror(char *s, char *f);
void    error(char *s);
int     doproj(struct place *, int *, int *);
int     cpoint(int, int, int);
int     plotpt(struct place *, int);
int     nocut(struct place *, struct place *, double *);

extern int (*projection)(struct place *, double *, double *);