📄 wzgridview.cxx
字号:
wzIndex i; wzgrid grid = *(wzgrid *) &data; wzArray<wzIndex> hidden(grid->cells); ibgMarkCells(win,grid,hidden); ibgComputeBoundingBox(win,grid,hidden,xm,xp); for(i=0;i<3;i++){ xmi[i] = xm[i]/fac[i]; xpi[i] = xp[i]/fac[i]; } // ibgTransformBoundingBox(grid,xm,xp,xmi,xpi); wzwSetVolume(win, xmi[0],xpi[0], xmi[1],xpi[1], xmi[2],xpi[2]);}/*static void ibgInitializeBoundingBox(wzWindow win, wzgrid grid){ wzFloat xm[3],xp[3],xmi[3],xpi[3]; wzIndex i; for(i=0;i<3;i++){ xm[i] = grid->cgmin(i); xp[i] = grid->cgmax(i); } ibgTransformBoundingBox(grid,xm,xp,xmi,xpi); wzwSetBaseVolume(win, xmi[0],xpi[0], xmi[1],xpi[1], xmi[2],xpi[2]);}*/static void wzViewCallback(wzWindow win, void *data){ wzInteger l,i,j,*cn0,cc,in,ic; wzFloat xm[3],xp[3],xc[3],dx[3]; wzFloat *n[4],x[3],xx[4][3]; double pp,qq; char temp[256]; wzInteger obj = wzwGetObject(win); wzCellType t; wzSegment s; wzInteger ori; wzInteger print,printNodes,printCells,slice,side; wzwGetSliceState(win,&slice); if(slice) return; if(wzwBackgroundIsBlack(win)) black_background.use(); else white_background.use(); wzgrid grid = *(wzgrid *) &data; wzIndex dim = grid->gdim(); wzArray<wzIndex> hidden(grid->cells); ibgMarkCells(win,grid,hidden); wzwGetEnum(win,obj,ModeSide,&side); wzwGetPoint(win,xc); wzwGetVolume(win,&xm[0],&xp[0],&xm[1],&xp[1],&xm[2],&xp[2]); for(i=0;i<3;i++){ xm[i] *= fac[i]; xp[i] *= fac[i]; xc[i] *= fac[i]; xm[i] += sh[i]; xp[i] += sh[i]; xc[i] += sh[i]; dx[i] = xp[i] - xm[i]; xm[i] -= 0.001*dx[i]; xp[i] += 0.001*dx[i]; } wzRangeLoop(grid->cells,cc){ if(hidden[cc]) continue; t = grid->cct(cc); l = wzCellTypePoints(t); cn0 = grid->ccn(cc); for(i=0;i<l;i++) n[i]=grid->cnx(cn0[i]); for(i=0;i<3;i++) {x[i]=0; for(j=0;j<l;j++) x[i] += n[j][i]; x[i] /= l;} if(checkPosition(x,xm,xp,xc,side)>0) continue; hidden[cc] = 1; } wzwGetSwitch(win,obj,SwitchOrientation,&ori); wzwGetDouble(win,obj,ValueShrink,&qq); qq /= 100; pp=1-qq; glBegin(GL_TRIANGLES); wzRangeLoop(grid->cells,cc){ if(hidden[cc]) continue; t = grid->cct(cc); l = wzCellTypePoints(t); cn0 = grid->ccn(cc); for(i=0;i<l;i++){ n[i]=grid->cnx(cn0[i]); } if(qq>0.001){ for(i=0;i<3;i++) { x[i]=0; for(j=0;j<l;j++) x[i] += n[j][i]; x[i] /= l; for(j=0;j<l;j++) xx[j][i] = (pp*n[j][i] + qq*x[i] - sh[i])/fac[i]; } }else{ for(i=0;i<3;i++) { for(j=0;j<l;j++) xx[j][i] = (n[j][i]-sh[i])/fac[i]; } } if(l==4){ DrawTetrahedron(xx[0],xx[1],xx[2],xx[3],grid->ccu(cc)); }else if (l<=2){ DrawFaceLine(xx[0],xx[1],grid->ccu(cc)); }else if (dim==2){ DrawRegionTriangle(xx[0],xx[1],xx[2],grid->ccu(cc)); }else if (ori){ if(grid->culeft(cc,t)>grid->curight(cc,t)) DrawFaceTriangle(xx[0],xx[1],xx[2],grid->ccu(cc)); else DrawFaceTriangle(xx[0],xx[2],xx[1],grid->ccu(cc)); }else{ if(grid->culeft(cc,t)>grid->curight(cc,t)) DrawFaceTriangle(xx[0],xx[2],xx[1],grid->ccu(cc)); else DrawFaceTriangle(xx[0],xx[1],xx[2],grid->ccu(cc)); } } glEnd(); wzwGetSwitch(win,obj,ModePrint,&print); if(print==0) goto end; printNodes = print & 1; printCells = print & 2; glColor3f(1.0,1.0,1.0); wzRangeLoop(grid->cells,cc){ if(hidden[cc]) continue; cn0 = grid->ccn(cc); t = grid->cct(cc); l = wzCellTypePoints(t); for(i=0;i<l;i++){ in = cn0[i]; n[i]= grid->cnx(in); s = grid->Point[in].segment(); if(printNodes){ for(j=0;j<3;j++) x[j]= (n[i][j]-sh[j])/fac[j]; if(s.isFace()) in = -in; wzColor& col = s.color(); glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0); glRasterPos3f((n[i][0]-sh[0])/fac[0], (n[i][1]-sh[1])/fac[1], (n[i][2]-sh[2])/fac[2]); sprintf(temp,"%d",in); wzwPrint(win,temp); } } if(printCells){ for(i=0;i<3;i++) {x[i]=0; for(j=0;j<l;j++) x[i] += n[j][i]; x[i] /= l;} if(wzCellTypeIsRegion(t)){ wzColor& col=((wzRegion)(grid->ccu(cc))).color(); ic = cc; glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0); }else if(wzCellTypeIsFace(t)){ wzColor& col=((wzFace)(grid->ccu(cc))).color(); ic = -cc; glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0); } glRasterPos3f((x[0]-sh[0])/fac[0],(x[1]-sh[1])/fac[1],(x[2]-sh[2])/fac[2]); sprintf(temp,"%d",ic); wzwPrint(win,temp); } }end: grid = 0;}static int checkCorrectness(wzgrid g, wzInteger cc){ wzInteger* cn0 = g->ccn(cc); wzInteger i,cl,cr; wzIndex t = g->cct(cc),u = g->ccu(cc); wzIndex codim = wzCellTypeCODIM(t); if(codim==1){ cl = wzGridCellLeft( *g,cc,t); if(cl>0 && g->ccu(cl)==0) return 1; cr = wzGridCellRight(*g,cc,t); if(cr>0 && g->ccu(cr)==0) return 1; } for(i=0;i<wzCellTypePoints(t);i++){ wzSegment s = g->Point[cn0[i]].segment(); if(s.codim()<codim) return 0; if(s.codim()>codim) continue; if(s.index()!=u) return 0; } return 1;}/* returns 0 if outside, 1 if visible, -1 if inside but hidden */static int checkPosition(double* x, double* min, double* max, double* center, int mode){ int i; for(i=0;i<3;i++){ if(x[i]<min[i]) return 0; if(x[i]>max[i]) return 0; } switch(mode){ case SideAll: return 1; case SideBehind: for(i=0;i<3;i++) if(x[i]>center[i]) return -1; return 1; case SideNotBefore: for(i=0;i<3;i++) if(x[i]<center[i]) return 1; return -1; case SideBefore: for(i=0;i<3;i++) if(x[i]<center[i]) return -1; return 1; case SideNotBehind: for(i=0;i<3;i++) if(x[i]>center[i]) return 1; return -1; } return 1;}static void DrawTetrahedron(double *p1, double *p2, double *p3, double *p4, wzRegion r){ wzColor col; col=r.color(); glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0); glVertex3f(p1[0],p1[1],p1[2]); glVertex3f(p2[0],p2[1],p2[2]); glVertex3f(p3[0],p3[1],p3[2]); glVertex3f(p1[0],p1[1],p1[2]); glVertex3f(p4[0],p4[1],p4[2]); glVertex3f(p2[0],p2[1],p2[2]); glVertex3f(p4[0],p4[1],p4[2]); glVertex3f(p1[0],p1[1],p1[2]); glVertex3f(p3[0],p3[1],p3[2]); glVertex3f(p2[0],p2[1],p2[2]); glVertex3f(p4[0],p4[1],p4[2]); glVertex3f(p3[0],p3[1],p3[2]);}static void DrawRegionTriangle(double *p1, double *p2, double *p3, wzRegion r){ wzColor col; col=r.color(); glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0); glVertex3f(p1[0],p1[1],p1[2]); glVertex3f(p2[0],p2[1],p2[2]); glVertex3f(p3[0],p3[1],p3[2]);}static void DrawFaceTriangle(double *p1, double *p2, double *p3, wzFace f){ wzColor col; col=f.color(); glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0); glVertex3f(p1[0],p1[1],p1[2]); glVertex3f(p2[0],p2[1],p2[2]); glVertex3f(p3[0],p3[1],p3[2]);}static void DrawFaceLine(double *p1, double *p2, wzFace f){ wzColor col; double d[3]; d[0] = p2[1]-p1[1]; d[1] = p1[0]-p2[0]; d[2] = 0; double r = 100*sqrt(d[0]*d[0]+d[1]*d[1]); if (r<=0.0) return; d[0] /= r; d[1] /= r; col=f.color(); glColor3f(col.r()/255.0,col.g()/255.0,col.b()/255.0); glVertex3f(p1[0]-d[0],p1[1]-d[1],p1[2]-d[2]); glVertex3f(p2[0]-d[0],p2[1]-d[1],p2[2]-d[2]); // glVertex3f(0.5*(p1[0]+p2[0]),0.5*(p1[1]+p2[1]),0.5*(p1[2]+p2[2])+0.05); glVertex3f(p1[0]+d[0],p1[1]+d[1],p1[2]+d[2]); glVertex3f(p1[0]+d[0],p1[1]+d[1],p1[2]+d[2]); glVertex3f(p2[0]+d[0],p2[1]+d[1],p2[2]+d[2]); glVertex3f(p2[0]-d[0],p2[1]-d[1],p2[2]-d[2]);}void wzGridView(wzWindow win, wzIndex i, wzgrid g, char* name, char* title){ wzwDefineObject((wzWindow)win,i, name[0],name,title,"wzgridview.html#Keys", (wzwCallback)wzViewCallback,*(void**)&g); // ibgInitializeBoundingBox((wzWindow)win,g); wzwDefineSwitch((wzWindow)win,i,SwitchOutside,GLW_o, "Outside","Show outer boundaries","wzgridview.html#o"); wzwDefineSwitch((wzWindow)win,i,SwitchBad,GLW_b, "Bad","Show bad cells only","wzgridview.html#b"); wzwDefineSwitch((wzWindow)win,i,SwitchOrientation,GLW_O, "Orientation","Switch face orientation","wzgridview.html#O"); wzwDefineSwitch((wzWindow)win,i,SwitchRegionMaterial,GLW_R, "Reg-Mat","Show region/material","wzgridview.html#r"); wzwDefineEnum((wzWindow)win,i,ModeBase,GLW_space, "Mode","Show region/face","wzgridview.html#space", baseModi,BaseModi); wzwDefineEnum((wzWindow)win,i,ModePrint,GLW_p, "Print","print numbers","wzgridview.html#p", printModi,PrintModi); wzwDefineEnum((wzWindow)win,i,ModeSide,GLW_a, "Side","choose the part to show","wzgridview.html#a", sideModi,SideModi); wzwDefineEnum((wzWindow)win,i,ModeSlice,GLW_x, "Intersection","choose x/y/z intersection","wzgridview.html#x", sliceModi,SliceModi); wzwDefineInteger((wzWindow)win,i,ValueNode,GLW_n, "node","set node","wzgridview.html#n", 0,g->points.last()); wzwDefineInteger((wzWindow)win,i,ValueCell,GLW_c, "cell","set cell","wzgridview.html#c", 0,g->cells.last()); wzwDefineInteger((wzWindow)win,i,ValueRegion,GLW_r, "region","set region","wzgridview.html#r", -50,50); wzwDefineInteger((wzWindow)win,i,ValueFace,GLW_f, "face","set face","wzgridview.html#f", -50,50); wzwDefineInteger((wzWindow)win,i,ValueSide,GLW_S, "side","side","wzgridview.html#S", 0,4); wzwDefineDouble((wzWindow)win,i,ValueShrink,GLW_s, "shrink","shrinks cells (in %)","wzgridview.html#s", 0.0,99.0); wzwDefineAction((wzWindow)win,i,ActionCenter,GLW_Return, "center","centers the picture","wzgridview.html#c", (wzwCallback) ibgBoundingBox); wzwDefineAction((wzWindow)win,i,ActionInfo,GLW_i, "info","more information about the choice","wzgridview.html#i", (wzwCallback) wzGridInfo);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -