int AACGMtransform(int ssze,void *src,int dsze,void *dst,void *data) { float *pnt; int s; double mlon,mlat; double glon,glat,r; pnt=(float *)src; if (data==NULL) { glat=pnt[0]; glon=pnt[1]; s=AACGMConvert(glat,glon,300,&mlat,&mlon,&r,0); pnt=(float *)dst; pnt[0]=mlat; pnt[1]=mlon; } else { mlat=pnt[0]; mlon=pnt[1]; s=AACGMConvert(mlat,mlon,300,&glat,&glon,&r,1); pnt=(float *)dst; pnt[0]=glat; pnt[1]=glon; } return s; }
int main(int argc,char *argv[]) { int arg; double ilon=0.0,ilat=0.0,alt=0.0; double olon=0.0,olat=0.0,r; char *fmt=NULL; char *dfmt="%f %f\n"; char *fname=NULL; FILE *fp; unsigned char option=0; unsigned char help=0; unsigned char flag=0; int c; char txt[256]; OptionAdd(&opt,"-help",'x',&help); OptionAdd(&opt,"-option",'x',&option); OptionAdd(&opt,"i",'x',&flag); OptionAdd(&opt,"lon",'d',&ilon); OptionAdd(&opt,"lat",'d',&ilat); OptionAdd(&opt,"alt",'d',&alt); OptionAdd(&opt,"fmt",'t',&fmt); OptionAdd(&opt,"f",'t',&fname); arg=OptionProcess(1,argc,argv,&opt,NULL); if (help==1) { OptionPrintInfo(stdout,hlpstr); exit(0); } if (option==1) { OptionDump(stdout,&opt); exit(0); } if (fmt==NULL) fmt=dfmt; if (fname==NULL) { AACGMConvert(ilat,ilon,alt,&olat,&olon,&r,flag); fprintf(stdout,fmt,olat,olon); } else { if (strcmp(fname,"-")==0) fp=stdin; else fp=fopen(fname,"r"); if (fp==NULL) exit(1); while(fgets(txt,255,fp) !=NULL) { for (c=0;(txt[c] !=0) && (c<256);c++) if (txt[c]=='#') break; if (txt[c]=='#') continue; if (sscanf(txt,"%lf %lf %lf\n", &ilat,&ilon,&alt) !=3) continue; AACGMConvert(ilat,ilon,alt,&olat,&olon,&r,flag); fprintf(stdout,fmt,olat,olon); } } return 0; }
void RPosMagGS(int center,int bcrd,int rcrd, struct RadarSite *pos, int frang,int rsep,int rxrise,double height, double *rho,double *lat,double *lng) { double rx; double radius; double psi,d; double re=6356.779; double offset=0; double bm_edge=0; double range_edge=0; if (center==0) { bm_edge=-pos->bmsep*0.5; range_edge=-0.5*rsep*20/3; } if (rxrise==0) rx=pos->recrise; else rx=rxrise; offset=pos->maxbeam/2.0-0.5; psi=pos->bmsep*(bcrd-offset)+bm_edge; d=slant_range(frang,rsep,rx,range_edge,rcrd+1)/2; if (height < 90) height=-re+sqrt((re*re)+2*d*re*sind(height)+(d*d)); fldpnth_gs(pos->geolat,pos->geolon,psi,pos->boresite, height,d,rho,lat,lng); AACGMConvert(*lat,*lng,(double) height,lat,lng,&radius,0); }
int cell_convert(float xoff,float yoff,float wdt,float hgt, float lat,float lon,float *px,float *py,int magflg, int (*trnf)(int,void *,int,void *,void *data),void *data) { int s; float map[2],pnt[2]; if (!magflg) { double mlat,mlon,glat,glon,r; int s; mlat=lat; mlon=lon; s=AACGMConvert(mlat,mlon,150,&glat,&glon,&r,1); lat=glat; lon=glon; } map[0]=lat; map[1]=lon; s=(*trnf)(2*sizeof(float),map,2*sizeof(float),pnt,data); if (s !=0) return -1; *px=xoff+wdt*pnt[0]; *py=yoff+hgt*pnt[1]; return 0; }
int RPosInvMag(int bm,int rn,int year,struct RadarSite *hdw,double frang, double rsep,double rx,double height, double *mlat,double *mlon,double *azm) { double flat,flon,frho; double fx,fy,fz; double gx,gy,gz; double glat,glon; double gdlat,gdlon,gdrho; double gbx,gby,gbz; double ghx,ghy,ghz; double bx,by,bz,b; double dummy,elv,azc; double tmp_ht; double xlat,xlon,nlat,nlon; int s; gdlat=hdw->geolat; gdlon=hdw->geolon; if (rx==0) rx=hdw->recrise; RPosGeo(1,bm,rn,hdw,frang,rsep,rx, height,&frho,&flat,&flon); sphtocar(frho,flat,flon,&fx,&fy,&fz); geodtgc(1,&gdlat,&gdlon,&gdrho,&glat,&glon,&dummy); sphtocar(gdrho,glat,glon,&gbx,&gby,&gbz); gx=fx-gbx; gy=fy-gby; gz=fz-gbz; norm_vec(&gx,&gy,&gz); glbthor(1,flat,flon,&gx,&gy,&gz,&ghx,&ghy,&ghz); norm_vec(&ghx,&ghy,&ghz); s=IGRFMagCmp(year,frho,flat,flon,&bx,&by,&bz,&b); if (s==-1) return -1; norm_vec(&bx,&by,&bz); ghz=-(bx*ghx+by*ghy)/bz; norm_vec(&ghx,&ghy,&ghz); elv=atan2d(ghz,sqrt(ghx*ghx+ghy*ghy)); azc=atan2d(ghy,-ghx); geodtgc(-1,&gdlat,&gdlon,&gdrho,&flat,&flon,&dummy); tmp_ht=frho-gdrho; AACGMConvert(flat,flon,tmp_ht,mlat,mlon,&dummy,0); fldpnt_sph(frho,flat,flon,azc,rsep,&xlat,&xlon); s=AACGMConvert(xlat,xlon,tmp_ht,&nlat,&nlon,&dummy,0); if (s==-1) return -1; if ((nlon-*mlon) > 180) nlon=nlon-360; if ((nlon-*mlon) < -180) nlon=nlon+360; fldpnt_azm(*mlat,*mlon,nlat,nlon,azm); return 0; }
void plot_maxmin(struct Plot *plot, struct CnvGrid *ptr,int magflg, float xoff,float yoff,float wdt,float hgt,float sze, int (*trnf)(int,void *,int,void *,void *data),void *data, unsigned int color,char mask,float width, struct PlotDash *dash) { int i,s; double min=1e10; double max=-1e10; float max_lon=0,max_lat=0; float min_lon=0,min_lat=0; float map[2],pnt[2]; float px,py; for (i=0;i<ptr->num;i++) { if (ptr->mag[i]>max) { max_lon=ptr->lon[i]; max_lat=ptr->lat[i]; max=ptr->mag[i]; } if (ptr->mag[i]<min) { min_lon=ptr->lon[i]; min_lat=ptr->lat[i]; min=ptr->mag[i]; } } if (!magflg) { double mlat,mlon,glat,glon,r; int s; mlat=max_lat; mlon=max_lon; s=AACGMConvert(mlat,mlon,150,&glat,&glon,&r,1); max_lat=glat; max_lon=glon; mlat=min_lat; mlon=min_lon; s=AACGMConvert(mlat,mlon,150,&glat,&glon,&r,1); min_lat=glat; min_lon=glon; } map[0]=max_lat; map[1]=max_lon; s=(*trnf)(2*sizeof(float),map,2*sizeof(float),pnt,data); if (s==0) { px=xoff+pnt[0]*wdt; py=yoff+pnt[1]*hgt; PlotLine(plot,px-sze,py,px+sze,py,color,mask,width,dash); PlotLine(plot,px,py-sze,px,py+sze,color,mask,width,dash); } map[0]=min_lat; map[1]=min_lon; s=(*trnf)(2*sizeof(float),map,2*sizeof(float),pnt,data); if (s==0) { px=xoff+pnt[0]*wdt; py=yoff+pnt[1]*hgt; PlotLine(plot,px-sze,py+sze,px+sze,py-sze,color,mask,width,dash); PlotLine(plot,px-sze,py-sze,px+sze,py+sze,color,mask,width,dash); } }
int main(int argc,char *argv[]) { int s=0; int arg; char *cfname=NULL; FILE *fp; int wdt=540,hgt=540; unsigned char help=0; unsigned char option=0; MapTransform tfunc; unsigned char flip=0; unsigned char gvp=0; unsigned char ortho=0; unsigned char stereo=0; unsigned char cylind=0; float lat=90,lon=0; float latmin=50.0; float sf=1.0; unsigned char sqflg=0; unsigned char magflg=0; unsigned char rotflg=0; unsigned char lstflg=0; unsigned char smflg=0; float marg[4]; int x,y; float e; char *tmetxt=NULL; char *dtetxt=NULL; double tval=-1; double dval=-1; int yr,mo,dy,hr,mt; double sc; int yrsec; float tme_shft; float glat,glon; float fx,fy; int px,py; float ka=0.8; float kd=0.3; float ks=0.4; float sn=4; double LsoT,LT,Hangle,dec,eqt,mlon; float minlat,minlon,maxlat,maxlon; float Lvec[3]={-1.0,0.0,0.5}; /* lighting vector */ OptionAdd(&opt,"-help",'x',&help); OptionAdd(&opt,"-option",'x',&option); OptionAdd(&opt,"cf",'t',&cfname); OptionAdd(&opt,"wdt",'i',&wdt); OptionAdd(&opt,"hgt",'i',&hgt); OptionAdd(&opt,"square",'x',&sqflg); OptionAdd(&opt,"ortho",'x',&ortho); OptionAdd(&opt,"stereo",'x',&stereo); OptionAdd(&opt,"gvp",'x',&gvp); OptionAdd(&opt,"lat",'f',&lat); OptionAdd(&opt,"lon",'f',&lon); OptionAdd(&opt,"latmin",'f',&latmin); OptionAdd(&opt,"sf",'f',&sf); OptionAdd(&opt,"mag",'x',&magflg); OptionAdd(&opt,"rotate",'x',&rotflg); OptionAdd(&opt,"flip",'x',&flip); OptionAdd(&opt,"lst",'x',&lstflg); OptionAdd(&opt,"t",'t',&tmetxt); OptionAdd(&opt,"d",'t',&dtetxt); OptionAdd(&opt,"smooth",'x',&smflg); OptionAdd(&opt,"ka",'f',&ka); OptionAdd(&opt,"kd",'f',&kd); OptionAdd(&opt,"ks",'f',&ks); OptionAdd(&opt,"n",'f',&sn); arg=OptionProcess(1,argc,argv,&opt,NULL); if (cfname !=NULL) { /* load the configuration file */ int farg; do { fp=fopen(cfname,"r"); if (fp==NULL) break; free(cfname); cfname=NULL; optf=OptionProcessFile(fp); if (optf !=NULL) { farg=OptionProcess(0,optf->argc,optf->argv,&opt,NULL); OptionFreeFile(optf); } fclose(fp); } while (cfname !=NULL); } if (help==1) { OptionPrintInfo(stdout,hlpstr); exit(0); } if (option==1) { OptionDump(stdout,&opt); exit(0); } if (argc==arg) { OptionPrintInfo(stderr,errstr); exit(-1); } fp=fopen(argv[arg],"r"); if (fp==NULL) { fprintf(stderr,"File not found.\n"); exit(-1); } s=ElevationLoad(fp,&eldata); fclose(fp); if (s !=0) { fprintf(stderr,"Error loading elevation data.\n"); exit(-1); } if (tmetxt !=NULL) tval=strtime(tmetxt); if (dtetxt !=NULL) { dval=strdate(dtetxt); tval+=dval; } TimeEpochToYMDHMS(tval,&yr,&mo,&dy,&hr,&mt,&sc); yrsec=TimeYMDHMSToYrsec(yr,mo,dy,hr,mt,sc); if ((ortho==0) && (stereo==0) && (gvp==0)) cylind=1; if ((lat<0) && (latmin>0)) latmin=-latmin; if ((lat>0) && (latmin<0)) latmin=-latmin; tfunc=MapCylindrical; if (ortho) tfunc=MapOrthographic; if (stereo) tfunc=MapStereographic; if (gvp) tfunc=MapGeneralVerticalPerspective; marg[0]=lat; marg[1]=lon; if ((ortho) || (gvp)) marg[2]=sf; else if (stereo) marg[2]=1.25*0.5*sf*90.0/(90-fabs(latmin)); else marg[2]=1; marg[3]=flip; SZASolarLoc(yr,yrsec,&mlon,&dec); eqt=SZAEqOfTime(mlon,yr); if (magflg) tme_shft=-AACGMConvertMLT(yr,yrsec,0.0)*15.0; else { if (lstflg) { LsoT=(hr*3600+mt*60+sc)+eqt; Hangle=15*(LsoT/3600); tme_shft=-Hangle; } else { LT=(hr*3600+mt*60+sc); Hangle=15*(LT/3600); tme_shft=-Hangle; } } if (rotflg) marg[1]=lon+tme_shft; if ((wdt==0) || (hgt==0)) { fprintf(stderr,"invalid plot size.\n"); exit(-1); } if (cylind) { marg[1]=0; marg[2]=0; } GeoMap(wdt,hgt,tfunc,marg,&ilat,&ilon); zbuf=malloc(sizeof(float)*wdt*hgt); minlat=eldata.lat+eldata.latsec/3600.0; minlon=eldata.lon+eldata.lonsec/3600.0; maxlat=minlat+eldata.numlat*eldata.latstp/36000.0; maxlon=minlon+eldata.numlon*eldata.lonstp/36000.0; if ((cylind) || (sqflg)) fbclp=NULL; else fbclp=fbclip(wdt,hgt); for (x=0;x<wdt;x++) { for (y=0;y<hgt;y++) { zbuf[y*wdt+x]=-1e6; if ((fbclp !=NULL) && (fbclp->clp[y*wdt+x]==0)) continue; if ((ilat[y*wdt+x]<-90.0) || (ilat[y*wdt+x]>90)) continue; glat=ilat[y*wdt+x]; glon=ilon[y*wdt+x]; if (magflg) { double mlat,mlon,rho; s=AACGMConvert(glat,glon,300.0,&mlat,&mlon,&rho,1); glat=mlat; glon=mlon; } if (cylind) { if (rotflg) glon+=lon+tme_shft; else glon+=lon; } if (glon>180) glon-=360; if (glat<minlat) continue; if (glon<minlon) continue; if (glat>=maxlat) continue; if (glon>=maxlon) continue; fy=(glat-minlat)/(maxlat-minlat); fx=(glon-minlon)/(maxlon-minlon); px=eldata.numlon*fx; py=eldata.numlat*fy; if (smflg) { float l,r,b,t; l=eldata.data[px*eldata.numlat+py]; if (px<eldata.numlon-1) r=eldata.data[(px+1)*eldata.numlat+py]; else r=l; b=l+(r-l)*(eldata.numlon*fx-px); if (py<eldata.numlat-1) { l=eldata.data[px*eldata.numlat+py+1]; if (px<eldata.numlon-1) r=eldata.data[(px+1)*eldata.numlat+py+1]; else r=l; t=l+(r-l)*(eldata.numlon*fx-px); } else t=b; e=b+(t-b)*(eldata.numlat*fy-py); } else e=eldata.data[px*eldata.numlat+py]; zbuf[y*wdt+x]=e; } } PhongModel(wdt,hgt,0,zbuf,Lvec,kd,ks,sn,&dbuf,&sbuf); ConvertFwriteInt(stdout,wdt); ConvertFwriteInt(stdout,hgt); for (y=0;y<hgt;y++) { for (x=0;x<wdt;x++) { ConvertFwriteFloat(stdout,zbuf[y*wdt+x]); } } for (y=0;y<hgt;y++) { for (x=0;x<wdt;x++) { ConvertFwriteFloat(stdout,ka+dbuf[y*wdt+x]); } } for (y=0;y<hgt;y++) { for (x=0;x<wdt;x++) { ConvertFwriteFloat(stdout,sbuf[y*wdt+x]); } } return 0; }
float *SZAMap(int yr,int mo,int dy,int hr,int mt,int sc,float latmin, int wdt,int hgt,int mode, int (*trf)(int ssze,void *src,int dsze, void *dst,void *data), void *data) { float lat,lon; float xstep=1.0; float ystep=1.0; int xnum,ynum; int x,y; int s,i,j; float *pnt=NULL; float *zbuf=NULL; int *vertex=NULL; int *mapping=NULL; float *image=NULL; int num=0,tnum,poly=0,tpoly; float zeroval=-400; double LsoT; double Hangle; double Z,eqt; double dec; double tlon,tlat,r; dec=SZASolarDec(yr,mo,dy,hr,mt,sc); eqt=SZAEqOfTime(yr,mo,dy,hr,mt,sc); xnum=(360/xstep)+1; ynum=180.0/ystep+1; zbuf=malloc(sizeof(float)*xnum*ynum); pnt=malloc(sizeof(float)*xnum*ynum*2); vertex=malloc(sizeof(int)*xnum*ynum*4); mapping=malloc(sizeof(int)*xnum*ynum); for (y=0;y<ynum;y++) { for (x=0;x<xnum;x++) { lon=x*xstep; lat=-90+y*ystep; if (mode==0) { tlat=lat; tlon=lon; } else { s=AACGMConvert(lat,lon,0,&tlat,&tlon,&r,1); } LsoT=(hr*3600+mt*60+sc)+(tlon*4*60)+eqt; Hangle=15*((LsoT/3600)-12); Z=SZAAngle(tlon,tlat,dec,Hangle); if ((y !=ynum-1) && (x !=xnum-1)) { vertex[4*poly]=num; vertex[4*poly+1]=num+1; vertex[4*poly+2]=vertex[4*poly+1]+xnum; vertex[4*poly+3]=num+xnum; poly++; } zbuf[num]=Z; pnt[2*num]=lat; pnt[2*num+1]=lon; num++; } } tnum=0; for (i=0;i<num;i++) { mapping[i]=-1; s=(*trf)(2*sizeof(float),&pnt[2*i],2*sizeof(float), &pnt[2*tnum],data); if (s !=0) continue; mapping[i]=tnum; zbuf[tnum]=zbuf[i]; pnt[2*tnum]=pnt[2*tnum]*wdt; pnt[2*tnum+1]=pnt[2*tnum+1]*hgt; tnum++; } tpoly=0; for (i=0;i<poly;i++) { for (j=0;j<4;j++) { if (mapping[vertex[4*i+j]]==-1) break; vertex[4*tpoly+j]=mapping[vertex[4*i+j]]; } if (j<4) continue; tpoly++; } image=Raster(wdt,hgt,0,raster_FLOAT,&zeroval,tpoly,pnt,vertex, zbuf); free(pnt); free(vertex); free(zbuf); free(mapping); return image; }