|
|
1.1 ! root 1: #include "map.h" ! 2: ! 3: struct place gywhem, gyehem; ! 4: struct coord gytwist; ! 5: float gyconst, gykc, gyside; ! 6: ! 7: Xguyou(place,x,y) ! 8: struct place *place; ! 9: float *x, *y; ! 10: { ! 11: int ew; /*which hemisphere*/ ! 12: float z1,z2; ! 13: struct place pl; ! 14: ew = place->wlon.l<0; ! 15: copyplace(place,&pl); ! 16: norm(&pl,ew?&gyehem:&gywhem,&gytwist); ! 17: Xstereographic(&pl,&z1,&z2); ! 18: dosquare(z1/2,z2/2,x,y); ! 19: if(!ew) ! 20: *x -= gyside; ! 21: return(1); ! 22: } ! 23: ! 24: dosquare(z1,z2,x,y) ! 25: float z1,z2; ! 26: float *x,*y; ! 27: { ! 28: double w1,w2; ! 29: w1 = z1 -1; ! 30: if(fabs(w1*w1+z2*z2)>.000001) { ! 31: cdiv(z1+1,z2,w1,z2,&w1,&w2); ! 32: w1 *= gyconst; ! 33: w2 *= gyconst; ! 34: if(w1<0) ! 35: w1 = 0; ! 36: elco2(w1,w2,gykc,1.,1.,x,y); ! 37: } else { ! 38: *x = gyside; ! 39: *y = 0; ! 40: } ! 41: } ! 42: ! 43: int (*guyou())() ! 44: { ! 45: float junk; ! 46: gykc = 1/(3+2*sqrt(2.)); ! 47: gyconst = -(1+sqrt(2.)); ! 48: elco2(-gyconst,0.,gykc,1.,1.,&gyside,&junk); ! 49: gyside *= 2; ! 50: latlon(0.,90.,&gywhem); ! 51: latlon(0.,-90.,&gyehem); ! 52: deg2rad(0.,&gytwist); ! 53: return(Xguyou); ! 54: } ! 55: ! 56: guycut(g,og,cutlon) ! 57: struct place *g,*og; ! 58: float *cutlon; ! 59: { ! 60: int c; ! 61: c = picut(g,og,cutlon); ! 62: if(c!=1) ! 63: return(c); ! 64: *cutlon = 0.; ! 65: if(g->nlat.c<.7071||og->nlat.c<.7071) ! 66: return(ckcut(g,og,0.)); ! 67: return(1); ! 68: } ! 69: ! 70: Xsquare(place,x,y) ! 71: struct place *place; ! 72: float *x,*y; ! 73: { ! 74: float z1,z2; ! 75: float r, theta; ! 76: struct place p; ! 77: copyplace(place,&p); ! 78: if(place->nlat.l<0) { ! 79: p.nlat.l = -p.nlat.l; ! 80: p.nlat.s = -p.nlat.s; ! 81: } ! 82: if(p.nlat.l<FUZZ && fabs(p.wlon.l)>PI-FUZZ){ ! 83: *y = -gyside/2; ! 84: *x = p.wlon.l>0?0:gyside; ! 85: return(1); ! 86: } ! 87: Xstereographic(&p,&z1,&z2); ! 88: r = sqrt(sqrt(hypot(z1,z2)/2)); ! 89: theta = atan2(z1,-z2)/4; ! 90: dosquare(r*sin(theta),-r*cos(theta),x,y); ! 91: if(place->nlat.l<0) ! 92: *y = -gyside - *y; ! 93: return(1); ! 94: } ! 95: ! 96: int (*square())() ! 97: { ! 98: guyou(); ! 99: return(Xsquare); ! 100: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.