float AACGMIDLConvertMLT(int argc,void *argv[]) { int16 *year; int32 *t; float *mlong; if (argc < 3) return -1; year = (int16 *) argv[0]; t = (int32 *) argv[1]; mlong = (float *) argv[2]; return (float) AACGMConvertMLT( (int) *year, (int) *t,(double) *mlong); }
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; }