⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wzgridview.cxx

📁 Delaunay三角形的网格剖分程序
💻 CXX
📖 第 1 页 / 共 2 页
字号:
  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 + -