Annotation of researchv10no/cmd/map/libmap/twocirc.c, revision 1.1.1.1

1.1       root        1: #include "map.h"
                      2: 
                      3: static double
                      4: quadratic(double a, double b, double c)
                      5: {
                      6:        double disc = b*b - 4*a*c;
                      7:        return disc<0? 0: (-b-sqrt(disc))/(2*a);
                      8: }
                      9: 
                     10: /* for projections with meridians being circles centered
                     11: on the x axis and parallels being circles centered on the y
                     12: axis.  Find the intersection of the meridian thru (m,0), (90,0),
                     13: with the parallel thru (0,p), (p1,p2) */
                     14: 
                     15: static int
                     16: twocircles(double m, double p, double p1, double p2, double *x, double *y)
                     17: {
                     18:        double a;       /* center of meridian circle, a>0 */
                     19:        double b;       /* center of parallel circle, b>0 */
                     20:        double t,bb;
                     21:        if(m > 0) {
                     22:                twocircles(-m,p,p1,p2,x,y);
                     23:                *x = -*x;
                     24:        } else if(p < 0) {
                     25:                twocircles(m,-p,p1,-p2,x,y);
                     26:                *y = -*y;
                     27:        } else if(p < .01) {
                     28:                *x = m;
                     29:                t = m/p1;
                     30:                *y = p + (p2-p)*t*t;
                     31:        } else if(m > -.01) {
                     32:                *y = p;
                     33:                *x = m - m*p*p;
                     34:        } else {
                     35:                b = p>=1? 1: p>.99? 0.5*(p+1 + p1*p1/(1-p)):
                     36:                        0.5*(p*p-p1*p1-p2*p2)/(p-p2);
                     37:                a = .5*(m - 1/m);
                     38:                t = m*m-p*p+2*(b*p-a*m);
                     39:                bb = b*b;
                     40:                *x = quadratic(1+a*a/bb, -2*a + a*t/bb,
                     41:                        t*t/(4*bb) - m*m + 2*a*m);
                     42:                *y = (*x*a+t/2)/b;
                     43:        }
                     44:        return 1;
                     45: }              
                     46: 
                     47: static int
                     48: Xglobular(struct place *place, double *x, double *y)
                     49: {
                     50:        twocircles(-2*place->wlon.l/PI,
                     51:                2*place->nlat.l/PI, place->nlat.c, place->nlat.s, x, y);
                     52:        return 1;
                     53: }      
                     54: 
                     55: proj
                     56: globular(void)
                     57: {
                     58:        return Xglobular;
                     59: }
                     60: 
                     61: static int
                     62: Xvandergrinten(struct place *place, double *x, double *y)
                     63: {
                     64:        double t = 2*place->nlat.l/PI;
                     65:        double abst = fabs(t);
                     66:        double pval = abst>=1? 1: abst/(1+sqrt(1-t*t));
                     67:        double p2 = 2*pval/(1+pval);
                     68:        twocircles(-place->wlon.l/PI, pval, sqrt(1-p2*p2), p2, x, y);
                     69:        if(t < 0) 
                     70:                *y = -*y;
                     71:        return 1;
                     72: }
                     73: 
                     74: proj
                     75: vandergrinten(void)
                     76: {
                     77:        return Xvandergrinten;
                     78: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.