📄 ibgomark.cxx
字号:
else if(ri<FaceType){ if(fi<ibgFaceRelativeFar) {ri = FaceType;} else {ri = FarFaceType;} }else if(rb<FarFaceType) {ri = FarFaceType;} }else if((fl=gg->bnUp[i][bn]) && (ff=gg->lFaceDown[fl])){ di = gg->fPoint[ff][i]- (xi=gg->nPoint[n][i]); wzAssert(di>-0.0001); if(di<cog->Delta){ 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;// Shifts the faces, edges and vertices which are in an absolute// delta-environment of nodes, lines and planes to the exact position// of these nodes, lines and planes.// Hides nodes under faces resp. faces/nodes under edges.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; wzBoolean rHide = RegionNodeRemoval & UnderdogRemoval; wzBoolean fHide = FaceNodeRemoval & UnderdogRemoval; // wzBoolean eHide = EdgeNodeRemoval & UnderdogRemoval; // wzBoolean vHide = VertexNodeRemoval & UnderdogRemoval; wzRangeLoop(gg->faces,ff){ if(gg->fType[ff]&ibgoHidden) continue; 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; if(fHide&&(gg->bnType[bu]&ibgoUnderFace)) gg->fType[ff] = ibgoHidden; if(rHide) gg->bnType[bu] = ibgoHidden; gg->bnType[bu] |= ibgoUnderFace; } 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; if(fHide&&(gg->bnType[bo]&ibgoUnderFace)) gg->fType[ff] = ibgoHidden; if(rHide) gg->bnType[bo] = ibgoHidden; gg->bnType[bo] |= ibgoUnderFace; } 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(fHide && df < delta2 && df > delta2N) gg->fType[ff] = ibgoHidden; if(rHide && du < delta2 && du > delta2N) gg->bnType[bu] = ibgoHidden; if(rHide && 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::hideBoundaryNodes(ibgoctree gg) const{ wzIndex bb; if(RegionNodeRemoval == 0xff){ wzRangeLoop(gg->bnodes,bb){ gg->bnType[bb] = ibgoHidden; } }}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; } shift(gg,10*delta); hideBoundaryNodes(gg); hideIrregular(gg); hideLongSideIntersections(gg); hideForbiddenFaceDirections(gg); return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -