|
|
1.1 ! root 1: #include "map.h" ! 2: ! 3: struct place pole; /* map pole is tilted to here */ ! 4: struct coord twist; /* then twisted this much */ ! 5: struct place ipole; /* inverse transfrom */ ! 6: struct coord itwist; ! 7: ! 8: double cirmod(); ! 9: ! 10: orient(lat, lon, theta) ! 11: float lat, lon, theta; ! 12: { ! 13: lat = cirmod(lat); ! 14: if(lat>90.) { ! 15: lat = 180. - lat; ! 16: lon -= 180.; ! 17: theta -= 180.; ! 18: } else if(lat < -90.) { ! 19: lat = -180. - lat; ! 20: lon -= 180.; ! 21: theta -= 180; ! 22: } ! 23: latlon(lat,lon,&pole); ! 24: deg2rad(theta, &twist); ! 25: latlon(lat,180.-theta,&ipole); ! 26: deg2rad(180.-lon, &itwist); ! 27: } ! 28: ! 29: latlon(lat,lon,p) ! 30: float lat,lon; ! 31: struct place *p; ! 32: { ! 33: lat = cirmod(lat); ! 34: if(lat>90.) { ! 35: lat = 180. - lat; ! 36: lon -= 180.; ! 37: } else if(lat < -90.) { ! 38: lat = -180. - lat; ! 39: lon -= 180.; ! 40: } ! 41: deg2rad(lat,&p->nlat); ! 42: deg2rad(lon,&p->wlon); ! 43: } ! 44: ! 45: deg2rad(theta, coord) ! 46: float theta; ! 47: struct coord *coord; ! 48: { ! 49: theta = cirmod(theta); ! 50: coord->l = theta*RAD; ! 51: if(theta==90) { ! 52: coord->s = 1; ! 53: coord->c = 0; ! 54: } else if(theta== -90) { ! 55: coord->s = -1; ! 56: coord->c = 0; ! 57: } else ! 58: sincos(coord); ! 59: } ! 60: ! 61: double cirmod(theta) ! 62: double theta; ! 63: { ! 64: while(theta >= 180.) ! 65: theta -= 360; ! 66: while(theta<-180.) ! 67: theta += 360.; ! 68: return(theta); ! 69: } ! 70: ! 71: sincos(coord) ! 72: struct coord *coord; ! 73: { ! 74: coord->s = sin(coord->l); ! 75: coord->c = cos(coord->l); ! 76: } ! 77: ! 78: normalize(gg) ! 79: struct place *gg; ! 80: { ! 81: norm(gg,&pole,&twist); ! 82: } ! 83: ! 84: invert(g) ! 85: struct place *g; ! 86: { ! 87: norm(g,&ipole,&itwist); ! 88: } ! 89: ! 90: norm(gg,pp,tw) ! 91: struct place *gg, *pp; ! 92: struct coord *tw; ! 93: { ! 94: register struct place *g; /*geographic coords */ ! 95: register struct place *p; /* new pole in old coords*/ ! 96: struct place m; /* standard map coords*/ ! 97: g = gg; ! 98: p = pp; ! 99: if(p->nlat.s == 1.) { ! 100: if(p->wlon.l+tw->l == 0.) ! 101: return; ! 102: g->wlon.l -= p->wlon.l+tw->l; ! 103: } else { ! 104: if(p->wlon.l != 0) { ! 105: g->wlon.l -= p->wlon.l; ! 106: sincos(&g->wlon); ! 107: } ! 108: m.nlat.s = p->nlat.s * g->nlat.s ! 109: + p->nlat.c * g->nlat.c * g->wlon.c; ! 110: m.nlat.c = sqrt(1. - m.nlat.s * m.nlat.s); ! 111: m.nlat.l = atan2(m.nlat.s, m.nlat.c); ! 112: m.wlon.s = g->nlat.c * g->wlon.s; ! 113: m.wlon.c = p->nlat.c * g->nlat.s ! 114: - p->nlat.s * g->nlat.c * g->wlon.c; ! 115: m.wlon.l = atan2(m.wlon.s, - m.wlon.c) ! 116: - tw->l; ! 117: *g = m; ! 118: } ! 119: sincos(&g->wlon); ! 120: if(g->wlon.l>PI) ! 121: g->wlon.l -= 2*PI; ! 122: else if(g->wlon.l<-PI) ! 123: g->wlon.l += 2*PI; ! 124: } ! 125: ! 126: double tan(x) ! 127: double x; ! 128: { ! 129: return(sin(x)/cos(x)); ! 130: } ! 131: printp(g) ! 132: struct place *g; ! 133: { ! 134: printf("%.3f %.3f %.3f %.3f %.3f %.3f\n", ! 135: g->nlat.l,g->nlat.s,g->nlat.c,g->wlon.l,g->wlon.s,g->wlon.c); ! 136: } ! 137: ! 138: copyplace(g1,g2) ! 139: struct place *g1,*g2; ! 140: { ! 141: *g2 = *g1; ! 142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.