📄 viewer3.c
字号:
} glEndList(); /*colored rays*/ glNewList(nhz*4+4,GL_COMPILE); for (is=0;is<ns;is++) { for (iray=0;iray<ray[is].nrays;iray++) { iflag=0; glBegin(GL_LINE_STRIP); for (it=0;it<ray[is].nseg[iray];it++) { if (fabs(ray[is].x[it][iray])<RADIUS && fabs(ray[is].y[it][iray])<RADIUS && fabs(ray[is].z[it][iray])<RADIUS) { tEmission( ray[is].v0[it][iray], 0.0, /*tmin*/ tmax, emission); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emission); glVertex3f( ray[is].x[it][iray], ray[is].y[it][iray], ray[is].z[it][iray]); iflag=1; } else if (iflag) break; /*once good, now bad*/ } glEnd(); } } glEndList(); } /************************************************************* Plot the wavefront if it is given. If the wffile does not contain effective data, ntris may be wild. In this case, do thing about the wavefront. *************************************************************/ if (wffp!=NULL) { fscanf(wffp,"%d = nwf2dump\n",&nwf); fprintf(stderr,"nwf2dump=%d\n",nwf); if (nwf>200) wffp=NULL; } if (wffp!=NULL) { emission[0]=1.0; emission[1]=1.0; emission[2]=0.0; emission[3]=1.0; wf=(Layer *)alloc1float(sizeof(Layer)*nwf); ntris=ealloc1int(sizeof(int)*nwf); for (iwf=0;iwf<nwf;iwf++) { if (1!=fscanf(wffp,"%d = ntris\n",&ntris[iwf])) { nwf=iwf; break; } if (ntris[iwf]==0) { nwf=iwf; break; } if (verbose) warn("ntris=%d of nwf=%d\n",ntris[iwf],nwf); wf[iwf].x=ealloc2float(3,ntris[iwf]); wf[iwf].y=ealloc2float(3,ntris[iwf]); wf[iwf].z=ealloc2float(3,ntris[iwf]); for (it=0;it<ntris[iwf];it++) { fscanf(wffp,"%f %f %f %f %f %f %f %f %f\n", wf[iwf].x[it], wf[iwf].y[it], wf[iwf].z[it], wf[iwf].x[it]+1,wf[iwf].y[it]+1,wf[iwf].z[it]+1, wf[iwf].x[it]+2,wf[iwf].y[it]+2,wf[iwf].z[it]+2); } fprintf(stderr,"Totally read in %d wavefront triangles\n",ntris[iwf]); for (it=0;it<ntris[iwf];it++) { for (iw=0;iw<3;iw++) { wf[iwf].x[it][iw]=((wf[iwf].x[it][iw]-xmin)/ (xmax-xmin)-0.5)*DIAMETER; wf[iwf].y[it][iw]=-((wf[iwf].y[it][iw]-ymin)/ (ymax-ymin)-0.5)*DIAMETER; wf[iwf].z[it][iw]=((wf[iwf].z[it][iw]-zmin)/ (zmax-zmin)-0.5)*DIAMETER; } } } fclose(wffp); fprintf(stderr,"Click right MB to get menu\n"); fprintf(stderr,"Click left MB and drag to rotate\n"); fprintf(stderr,"Press shift and push left MB to scale\n"); glNewList(nhz*4+6,GL_COMPILE); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emission); for (iwf=0;iwf<nwf;iwf++) { for (itri=0;itri<ntris[iwf];itri++) { glBegin(GL_LINE_LOOP); if (fabs(wf[iwf].x[itri][0])<RADIUS && fabs(wf[iwf].y[itri][0])<RADIUS && fabs(wf[iwf].z[itri][0])<RADIUS && fabs(wf[iwf].x[itri][1])<RADIUS && fabs(wf[iwf].y[itri][1])<RADIUS && fabs(wf[iwf].z[itri][1])<RADIUS && fabs(wf[iwf].x[itri][2])<RADIUS && fabs(wf[iwf].y[itri][2])<RADIUS && fabs(wf[iwf].z[itri][2])<RADIUS) { glVertex3f(wf[iwf].x[itri][0], wf[iwf].y[itri][0], wf[iwf].z[itri][0]); glVertex3f(wf[iwf].x[itri][1], wf[iwf].y[itri][1], wf[iwf].z[itri][1]); glVertex3f(wf[iwf].x[itri][2], wf[iwf].y[itri][2], wf[iwf].z[itri][2]); } else { fprintf(stderr,"warning: some triangles ignored\n"); glEnd(); break; } glEnd(); } } glEndList(); /*solid wavefronts*/ glNewList(nhz*4+7,GL_COMPILE); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emission); for (iwf=0;iwf<nwf;iwf++) { for (itri=0;itri<ntris[iwf];itri++) { glBegin(GL_TRIANGLE_STRIP); if (fabs(wf[iwf].x[itri][0])<RADIUS && fabs(wf[iwf].y[itri][0])<RADIUS && fabs(wf[iwf].z[itri][0])<RADIUS && fabs(wf[iwf].x[itri][1])<RADIUS && fabs(wf[iwf].y[itri][1])<RADIUS && fabs(wf[iwf].z[itri][1])<RADIUS && fabs(wf[iwf].x[itri][2])<RADIUS && fabs(wf[iwf].y[itri][2])<RADIUS && fabs(wf[iwf].z[itri][2])<RADIUS) { glVertex3f(wf[iwf].x[itri][0], wf[iwf].y[itri][0], wf[iwf].z[itri][0]); glVertex3f(wf[iwf].x[itri][1], wf[iwf].y[itri][1], wf[iwf].z[itri][1]); glVertex3f(wf[iwf].x[itri][2], wf[iwf].y[itri][2], wf[iwf].z[itri][2]); } else { fprintf(stderr,"warning: some triangles ignored\n"); glEnd(); break; } glEnd(); } } glEndList(); } /*surface traveltimes*/ if (sttfp!=NULL) { fscanf(sttfp,"%d = ntris\n",&ntr); fprintf(stderr,"ntr=%d\n",ntr); if (ntr>2000) sttfp=NULL; } if (sttfp!=NULL && ntr>0) { stt=ealloc3float(3,3,ntr); ttt=ealloc2float(3,ntr); tmax=0.0; tmin=1.0e+10; for (itri=0;itri<ntr;itri++) { fscanf(sttfp,"%f %f %f %f %f %f %f %f %f %f %f %f\n", &stt[itri][0][0], &stt[itri][0][1], &stt[itri][0][2], &ttt[itri][0], &stt[itri][1][0], &stt[itri][1][1], &stt[itri][1][2], &ttt[itri][1], &stt[itri][2][0], &stt[itri][2][1], &stt[itri][2][2], &ttt[itri][2]); tmax=MAX(tmax,ttt[itri][0]); tmax=MAX(tmax,ttt[itri][1]); tmax=MAX(tmax,ttt[itri][2]); tmin=MIN(tmin,ttt[itri][0]); tmin=MIN(tmin,ttt[itri][1]); tmin=MIN(tmin,ttt[itri][2]); stt[itri][0][0]=((stt[itri][0][0]-xmin)/ (xmax-xmin)-0.5)*DIAMETER; stt[itri][0][1]=-((stt[itri][0][1]-ymin)/ (ymax-ymin)-0.5)*DIAMETER; stt[itri][0][2]=((stt[itri][0][2]-zmin)/ (zmax-zmin)-0.5)*DIAMETER; stt[itri][1][0]=((stt[itri][1][0]-xmin)/ (xmax-xmin)-0.5)*DIAMETER; stt[itri][1][1]=-((stt[itri][1][1]-ymin)/ (ymax-ymin)-0.5)*DIAMETER; stt[itri][1][2]=((stt[itri][1][2]-zmin)/ (zmax-zmin)-0.5)*DIAMETER; stt[itri][2][0]=((stt[itri][2][0]-xmin)/ (xmax-xmin)-0.5)*DIAMETER; stt[itri][2][1]=-((stt[itri][2][1]-ymin)/ (ymax-ymin)-0.5)*DIAMETER; stt[itri][2][2]=((stt[itri][2][2]-zmin)/ (zmax-zmin)-0.5)*DIAMETER; } } tmax=MAX(tmax,tmin+0.01); glNewList(nhz*4+5,GL_COMPILE); for (itri=0;itri<ntr;itri++) { glBegin(GL_TRIANGLE_STRIP); tEmission(ttt[itri][0],tmin,tmax,emission); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emission); glVertex3fv(stt[itri][0]); tEmission(ttt[itri][1],tmin,tmax,emission); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emission); glVertex3fv(stt[itri][1]); tEmission(ttt[itri][2],tmin,tmax,emission); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emission); glVertex3fv(stt[itri][2]); glEnd(); } glEndList(); glutMainLoop(); return 0;}/*********************************************************************Author: Zhaobo Meng, CWP 1996*********************************************************************/voidshowHorz( int ihz,float ***data, int nx,int ny,float ***emis){ int ix,iy; int nxhalf; nxhalf=nx/2; glNewList(ihz+nhz+3,GL_COMPILE); glBegin(GL_QUAD_STRIP); for (ix=0;ix<nx-1;ix++) { for (iy=0;iy<ny;iy++) { glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emis[iy][ix]); glVertex3fv(data[iy][ix]); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emis[iy][ix+1]); glVertex3fv(data[iy][ix+1]); } for (iy=ny-1;iy>=0;iy--) { glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emis[iy][ix+1]); glVertex3fv(data[iy][ix+1]); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emis[iy][ix]); glVertex3fv(data[iy][ix]); } } glEnd(); glEndList();}voidshowLayer(int ihz,float ***databot,float ***datatop, int nx,int ny,float ***emisbot,float ***emistop) { int ix,iy; glNewList(ihz+3,GL_COMPILE); glBegin(GL_QUAD_STRIP); for (ix=0;ix<nx-1;ix++) { for (iy=0;iy<ny;iy++) { if (databot[iy][ix][2]<EPS+datatop[iy][ix][2] && databot[iy][ix+1][2]<EPS+datatop[iy][ix+1][2]) continue; glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emisbot[iy][ix]); glVertex3fv(databot[iy][ix]); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emisbot[iy][ix+1]); glVertex3fv(databot[iy][ix+1]); } for (iy=ny-1;iy>=0;iy--) { if (databot[iy][ix][2]<EPS+datatop[iy][ix][2] && databot[iy][ix+1][2]<EPS+datatop[iy][ix+1][2]) continue; glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emistop[iy][ix]); glVertex3fv(datatop[iy][ix]); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emistop[iy][ix+1]); glVertex3fv(datatop[iy][ix+1]); } } for (iy=0;iy<ny;iy++) { if (databot[iy][nx-1][2]<EPS+datatop[iy][nx-1][2]) continue; glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emisbot[iy][nx-1]); glVertex3fv(databot[iy][nx-1]); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emistop[iy][nx-1]); glVertex3fv(datatop[iy][nx-1]); } for (ix=nx-1;ix>=0;ix--) { if (databot[ny-2][ix][2]<EPS+datatop[ny-2][ix][2]) continue; glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emisbot[ny-1][ix]); glVertex3fv(databot[ny-1][ix]); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emistop[ny-1][ix]); glVertex3fv(datatop[ny-1][ix]); } for (iy=ny-1;iy>=0;iy--) { if (databot[iy][0][2]<EPS+datatop[iy][0][2]) continue; glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emisbot[iy][0]); glVertex3fv(databot[iy][0]); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emistop[iy][0]); glVertex3fv(datatop[iy][0]); } for (ix=0;ix<nx;ix++) { if (databot[0][ix][2]<EPS+datatop[0][ix][2]) continue; glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emisbot[0][ix]); glVertex3fv(databot[0][ix]); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emistop[0][ix]); glVertex3fv(datatop[0][ix]); } glEnd(); glEndList();}void /*notice: I changed the order of 0 and 1 here to make it upside down*/showTetra(int ihz,float ***datatop,float ***databot, int nx,int ny,float ***emistop,float ***emisbot) { int ix,iy; glNewList(ihz+3+nhz*2,GL_COMPILE); glBegin(GL_LINES); /********************************************************** Plot 2 grids like this (ix,iy+2)_____(ix+1,iy+2) | /| | / | | / | | / | |/ | (ix,iy+1)|-----|(ix+1,iy+1) |\ | | \ | | \ | | \ | (ix,iy)|____\|(ix+1,iy) **********************************************************/ for (ix=0;ix<nx-1;ix++) { /*horizontal edges*/ for (iy=0;iy<ny;iy++) { glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emisbot[iy][ix]); glVertex3fv(databot[iy][ix]); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emisbot[iy][ix+1]); glVertex3fv(databot[iy][ix+1]); } } for (ix=0;ix<nx;ix++) { /*vertical edges*/ for (iy=0;iy<ny-1;iy++) { glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emisbot[iy][ix]); glVertex3fv(databot[iy][ix]); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emisbot[iy+1][ix]); glVertex3fv(databot[iy+1][ix]); } } for (ix=0;ix<nx-1;ix++) { /*slant edges*/ for (iy=0;iy<ny-1;iy+=2) { glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emisbot[iy+1][ix]); glVertex3fv(databot[iy+1][ix]); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emisbot[iy][ix+1]); glVertex3fv(databot[iy][ix+1]); } for (iy=1;iy<ny-1;iy+=2) { glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emisbot[iy][ix]); glVertex3fv(databot[iy][ix]); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emisbot[iy+1][ix]); glVertex3fv(databot[iy+1][ix+1]); } } /*the base horizon*/ for (ix=0;ix<nx-1;ix++) { /*horizontal edges*/ for (iy=0;iy<ny;iy++) { glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emistop[iy][ix]); glVertex3fv(datatop[iy][ix]); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emistop[iy][ix+1]); glVertex3fv(datatop[iy][ix+1]); } } for (ix=0;ix<nx;ix++) { /*vertical edges*/ for (iy=0;iy<ny-1;iy++) { glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emistop[iy][ix]); glVertex3fv(datatop[iy][ix]); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emistop[iy+1][ix]); glVertex3fv(datatop[iy+1][ix]); } } for (ix=0;ix<nx-1;ix++) { /*slant edges*/ for (iy=0;iy<ny-1;iy+=2) { glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emistop[iy+1][ix]); glVertex3fv(datatop[iy+1][ix]); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emistop[iy][ix+1]); glVertex3fv(datatop[iy][ix+1]); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -