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 + -
显示快捷键?