ibgomark.cxx

来自「有限元学习研究用源代码(老外的),供科研人员参考」· CXX 代码 · 共 485 行 · 第 1/2 页

CXX
485
字号
	    gg->fPoint[ff][i] = gg->nPoint[n][i]; 
	    gg->fPointUp[ff][i] -= di;
	    gg->fPointDown[ff][i] -= di;
	    rx = OnFace; continue;
	  }
	  fi = di/(gg->nPoint[gg->nUp[i][n]][i]-xi);
	  if(fi<ibgFaceRelativeClose)	{ri = CloseFaceType;}
	  else if(ri<FaceType){
	    if(fi<ibgFaceRelativeFar)	{ri = FaceType;}
	    else 			{ri = FarFaceType;}
	  }else if(rb<FarFaceType)	{ri = FarFaceType;}
	}
      }
    }
    if(ibgBasicMode == hideAll){
      rc = ibgoHidden;
    }else if(rx==OnFace){		// if on face, hide always!!!!
      rc = ibgoHidden;
      //      near++; near(" <>(<>)\n")<<n,bn;
    }else if(ibgBasicMode == hideNothing){
      rc = ibgoVisible;
    }else if(rx==RefinedNode){
      rc = ibgoHidden;
    }else if(ibgBasicMode == hideRefined){
      rc = ibgoVisible;
    }else if(dim==0){			// do not hide the outer corner !!
      rc = ibgoVisible;
    }else if (dim==1){		// hide an outer edge point only if close!
      rc = ibgoHidden;
      if(ibgBasicMode == hideFew){
	if(ri==CloseFaceType) 	rc = ibgoHidden;
	else			rc = ibgoVisible;
      }
    }else if (ri == FarFaceType){
      if(ibgBasicMode == hideFew)	rc = ibgoVisible;
      else				rc = ibgoHidden;
    }else if (border==0){	// hide all other inner boundary nodes;
      if(ri==Default)	rc = ibgoVisible;
      else		rc = ibgoHidden;
    }else if (ri == CloseFaceType){	// what remains is dim=2, border=1;
      rc = ibgoHidden;
    }else if (rb == CloseFaceType){	// very skew intersection - hold the point
      rc = ibgoVisible;
    }else if (rb == Default){
      rc = ibgoHidden;
    }else{
      rc = ibgoVisible;
    }
    gg->bnType[bn] = rc;
    //    gg->bnType[bn] = ibgoVisible;
    if(rc == ibgoHidden)
      { cogInfoOmittedNodes++; cogInfoOmittedNodes(" <>(<>)\n")<<n,bn;}

  }
  wzRangeLoop(gg->faces,ff){
    ll = gg->fLine[ff]; 	d  = gg->lDirection(ll);
    bo = gg->lNodeUp[ll];	no = gg->bnBase[bo];
    bu = gg->lNodeDown[ll];	nu = gg->bnBase[bu];
    dx =  (xo=gg->nPoint[no][d])   - (xu = gg->nPoint[nu][d]);
    df = ((xf = gg->fPoint[ff][d]) -  xu)/dx;
    if(df>0.5){
      nt = nu; nu = no; no = nt; ou = bu; bu = bo; bo = ou;
      df = ((xu = gg->nPoint[nu][d])-xf)/dx;
    }else{
      ou = bu;
    }
    wzAssert(df<0.50001); wzAssert(df>-0.00001);
    mark = ibgoVisible;
    for(s=0;s<gg->LineSides;s++){
      r = gg->lsLine[d][s]; dr = gg->Up(r);
      e = gg->fEdge[s][ff];
      yf = gg->fPoint[ff][dr];
      if(e>0){
	de = gg->ePoint[e][dr] - yf;
	dp = gg->ePoint[e][d]  - xf;
	if(de<cog->Delta && de > -cog->Delta){
	    gg->ePoint[e][dr] = gg->fPoint[ff][dr]; 
	    gg->ePointFace[e][dr] -= de;
	    gg->ePointUp[e][dr] -= de;
	    gg->ePointDown[e][dr] -= de;
	    gg->pEdge[pe = gg->bnPlane[gg->lsPlane[d][s]][ou]] = e;
	    if(dp<cog->Delta && dp > -cog->Delta){
	      gg->ePoint[e][d] = gg->fPoint[ff][d]; 
	      gg->ePointFace[e][d] -= dp;
	      gg->ePointUp[e][d] -= dp;
	      gg->ePointDown[e][d] -= dp;
	      mark = ibgoHidden;
	    }
	}
	if(gg->is_undefined(nr=gg->nNext[r][nu])) nr=gg->nNext[r][no];
	dy = (yr=gg->nPoint[nr][dr]) - yf; if(dy<0) dy = -dy;
	de1 = de/dy; if(de1<0) de1 = -de1;
	dp1 = dp/dx; if(dp1<0) dp1 = -dp1;
	if(ibgBasicMode >= hideFew){
	  if(de1 + ibgEdgeTooClosePar*dp1 < ibgEdgeTooClose){
	    mark = ibgoHidden;
	  }
	}
	de = gg->ePoint[e][dr] - yr;
	if(de<cog->Delta && de > -cog->Delta){
	    gg->ePoint[e][dr] = yr;
	    gg->ePointFace[e][dr] -= de;
	    gg->ePointUp[e][dr] -= de;
	    gg->ePointDown[e][dr] -= de;
	}
	de = gg->ePoint[e][d] - xu;
	if(de<cog->Delta && de > -cog->Delta){
	    gg->ePoint[e][d] = xu;
	    gg->ePointFace[e][d] -= de;
	    gg->ePointUp[e][d] -= de;
	    gg->ePointDown[e][d] -= de;
	}
	de = gg->ePoint[e][d] - xo;
	if(de<cog->Delta && de > -cog->Delta){
	    gg->ePoint[e][d] = xo;
	    gg->ePointFace[e][d] -= de;
	    gg->ePointUp[e][d] -= de;
	    gg->ePointDown[e][d] -= de;
	}
      }
      if(gg->is_undefined(nr=gg->nNext[r][nu])) continue;
      rt = (gg->nPoint[nr][dr] - yf)/dx; if(rt<0) rt = -rt;
      if(ibgBasicMode >= hideFew){
	if((ls=gg->bnNext[r][bu]) &&
	   (fr=gg->lFaceDown[ls])  &&
	   (!gg->is_outside(gg->nNext[gg->Other(r)][nu]))){
	  rf = (gg->fPoint[fr][dr] - yf)/dx; if(rf<0) rf = -rf;
	  if( rt < 0.501){
	    if(df > ibgOnLongSideButClose*rt)	mark = ibgoHidden;
	  }else if( rt > 1.99){
	    if((rf < ibgOnLongSideButClose) &&
	       (df < ibgOtherFaceTooClose))	mark = ibgoHidden;
	  }else if(df < ibgFaceVeryClose){
	    if(rf<ibgFaceVeryClose*rt){
	      if(d<dr)				mark = ibgoHidden;
	    }else					;//mark = ibgoHidden;
	  }else if(df > rf){
	    if(df < ibgOtherFaceTooClose)		mark = ibgoHidden;
	  }
	}      
      }
    }
    gg->fType[ff] = mark;
    gg->fType[ff] = ibgoVisible;
    if(mark == ibgoHidden){ 
      cogInfoOmittedFaces++; cogInfoOmittedFaces(" <>(<>)\n")<<ff;
    }
  }
  //  shift(gg,cog->Delta);
}

void CogenOctree::shift(ibgoctree gg, wzFloat delta) const
{
  wzIndex ll,d,r,o,s,bo,bu,no,nu,nr,ff,ee;
  wzFloat xu,du,xo,d0,xf,df,yf,de,yr,dr;
  wzFloat delta2 = 2*delta;
  wzFloat deltaN = -delta;
  wzFloat delta2N = -delta2;
  wzRangeLoop(gg->faces,ff){
    ll = gg->fLine[ff]; 	d  = gg->lDirection(ll);
    bo = gg->lNodeUp[ll];	no = gg->bnBase[bo];
    bu = gg->lNodeDown[ll];	nu = gg->bnBase[bu];
    for(s=0;s<gg->Lines;s++){
      if(s!=d)  gg->fPoint[ff][s] = gg->nPoint[nu][s];
    }
    du = (xf = gg->fPoint[ff][d]) - (xu = gg->nPoint[nu][d]);
    wzAssert(du>deltaN);
    if(du<delta){
      gg->fPoint[ff][d]	= xf	 = xu;
      gg->fPointUp[ff][d] 	-= du;
      gg->fPointDown[ff][d]	-= du;
      gg->bnType[bu] = ibgoHidden;
    }
    d0 = (xo = gg->nPoint[no][d]) - xf;
    wzAssert(d0>deltaN);
    if(d0<delta){
      gg->fPoint[ff][d]	= xf	 = xo;
      gg->fPointUp[ff][d] 	+= d0;
      gg->fPointDown[ff][d]	+= d0;
      gg->bnType[bo] = ibgoHidden;
    }
    for(s=0;s<gg->LineSides;s++){
      r  = gg->lsLine[d][s]; o = gg->Up(r);
      ee = gg->fEdge[s][ff];
      if(ee>0){
	du = gg->ePoint[ee][d]  - xu;
	d0 = gg->ePoint[ee][d]  - xo;
	df = gg->ePoint[ee][d]  - xf;
	if(du < delta2 && du > delta2N){
	  gg->ePoint[ee][d]	 = xu;
	  gg->ePointFace[ee][d]	-= du;
	  gg->ePointUp[ee][d]	-= du;
	  gg->ePointDown[ee][d]	-= du;
	}else if(d0 < delta2 && d0 > delta2N){
	  gg->ePoint[ee][d]	 = xo;
	  gg->ePointFace[ee][d]	-= d0;
	  gg->ePointUp[ee][d]	-= d0;
	  gg->ePointDown[ee][d]	-= d0;
	}else if(df < delta2 && df > delta2N){
	  gg->ePoint[ee][d]	 = xf;
	  gg->ePointFace[ee][d]	-= df;
	  gg->ePointUp[ee][d]	-= df;
	  gg->ePointDown[ee][d]	-= df;
	}
	if(gg->is_undefined(nr=gg->nNext[r][nu])) nr=gg->nNext[r][no];
	de = gg->ePoint[ee][o] - (yf=gg->fPoint[ff][o]);
	dr = gg->ePoint[ee][o] - (yr=gg->nPoint[nr][o]);
	if(de < delta2 && de > delta2N){
	  gg->ePoint[ee][o] 	 = yf;
	  gg->ePointFace[ee][o]	-= de;
	  gg->ePointUp[ee][o] 	-= de;
	  gg->ePointDown[ee][o] -= de;
	  if(df < delta2 && df > delta2N) gg->fType[ff]  = ibgoHidden;
	  if(du < delta2 && du > delta2N) gg->bnType[bu] = ibgoHidden;
	  if(d0 < delta2 && d0 > delta2N) gg->bnType[bo] = ibgoHidden;
	}
	if(dr<delta2 && dr > delta2N){
	  gg->ePoint[ee][o] 	 = yr;
	  gg->ePointFace[ee][o] -= dr;
	  gg->ePointUp[ee][o] 	-= dr;
	  gg->ePointDown[ee][o] -= dr;
	}
      }
    }
  }
}

void CogenOctree::mark(ibgoctree gg, wzFloat delta) const
{
  wzIndex bn,ff;
  wzRangeLoop(gg->bnodes,bn){
    gg->bnType[bn] = ibgoVisible;
  }
  wzRangeLoop(gg->faces,ff){
    gg->fType[ff] = ibgoVisible;
  }
  hideIrregular(gg);
  hideLongSideIntersections(gg);
  shift(gg,delta);
  return;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?