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

📄 ibgosplit.cxx

📁 Delaunay三角形的网格剖分程序
💻 CXX
字号:
#include "ibgoctree.hxx"/* basic splitting functions (pure splitting, correct data structures * before and after splitting, no refinement strategies)ibgiCell ibgOctree3D::splitCell(ibgiCell qq, unsigned ro);ibgIndex ibgOctree::splitBoundaryLine(ibgIndex nu, ibgIndex dir, ibgIndex nh); */ibgIndex ibgOctree::splitBoundaryLine(ibgiNode nu, ibgIndex dir, ibgiNode nh){  ibgIndex i,lo,lu,bnh,bnu;  wzInteger ff,fo;  nBoundary[nh] = 0;  bnu = nBoundary[nu];   if(bnu==0)	{return 0;}  lo = bnUp[dir][bnu];	  if(lo==0)	{return 0;}  bnh = createSimpleBoundaryNode(nh);  lu  = bnUp[dir][bnu] = bnDown[dir][bnh] = lines.create();  bnUp[dir][bnh]= lo;  lNodeDown[lo] = bnh;  lNodeDown[lu] = bnu;  lNodeUp[lu]   = bnh;  lType[lu] = lType[lo];  for(i=0;i<LineSides;i++) lPlane[i][lu]  = lPlane[i][lo];// does not split planes!!  lFaceUp[lu] = lFaceDown[lu] = 0;  ff = lFaceDown[lo];  if(ff && fPoint[ff][dir]<nPoint[nh][dir]){    lFaceDown[lu] = ff; fLine[ff] = lu; fo = ff;     while((ff = -fUp[fo])>0){      if(fPoint[ff][dir]>=nPoint[nh][dir]){	fDown[ff] = fUp[fo] = 0;	break;      }      fLine[ff] = lu; fo = ff;    }    lFaceUp[lu] = fo;     if(ff<0)  lFaceDown[lo] = 0;    else      lFaceDown[lo] = ff;    if(ff==0) lFaceUp[lo] = 0;    //    wzAssert(fPointUp[fo].segment() == nPoint[nh].segment());  }else{    //    wzAssert(nPoint[nh].segment() == nPoint[nu].segment());  }  return lu;}ibgiCell ibgOctree3D::splitCell(ibgiCell qq, unsigned ro){  int nu,no,nh,n0,n1,n2,n3,nr,nl,nur,nhr,nor,nurr;//,nt;  int ou,oo,oh;  int qn,o,w,eo,eu,fo,fu,go,gu;  int rr,ru=Other(ro);    if(is_undefined(qq)) return 0;  nu = cNode[(lsCell[ru][3])][qq];  no = cNode[(int)lsCell[ro][3]][qq];  for(o=0;o<LineSides;o++){    ou = nu; nu = cNode[lsCell[ru][o]][qq];    oo = no; no = cNode[lsCell[ro][o]][qq];    if(no==nNext[ro][nu])	return 0;    wzAssert(no==nNext[ro][nNext[ro][nu]]);    if((nor=nNext[lsLine[ro][o]][oo])==no) continue;    wzAssert(no==nNext[lsLine[ro][o]][nor]);    if((nur=nNext[lsLine[ru][o]][ou])==nu) continue;    wzAssert(nu==nNext[lsLine[ro][o]][nur]);    if(nor==nNext[ro][nur])	return 0;    wzAssert(is_undefined(nt=nNext[ro][nur])||nor==nNext[ro][nt]);  }    qn = cells.create();  cBoundary[qn]=0;  eu = lsCell[ru][3]; eo = lsCell[ro][3];  nu = cNode[eu][qq]; nh = nNext[ro][nu]; wzAssert(is_defined(nh));  no = cNode[eo][qq]; wzAssert(nNext[ro][nh] == no);  fu = cReverse[eo]; fo = cReverse[eu];  for(o=0;o<LineSides;o++){    ou = nu; gu = fu; oh = nh; go = fo;    eu = lsCell[ru][o];  eo = lsCell[ro][o];    fu = cReverse[eo]; fo = cReverse[eu];    nu = cNode[eu][qq];  nh = nNext[ro][nu]; wzAssert(is_defined(nh));    no = cNode[eo][qq];  wzAssert(nNext[ro][nh] == no);    cNode[eu][qn] = nu;  cNode[eo][qn] = nh; cNode[eu][qq] = nh;    nCell[fo][nu] = qn;  nCell[fu][nh] = qn; wzAssert(nCell[fo][nh]==qq);    rr = lsLine[ru][o];    if((nhr=nNext[rr][oh])!=nh) {      wzAssert(is_defined(nhr));      wzAssert(nNext[rr][nhr]==nh);      nCell[fu][nhr]=qn; nCell[gu][nhr]=qn;    }    if((nur=nNext[rr][ou])!=nu) {      nCell[fo][nur]=qn; nCell[go][nur]=qn;      if(o>1)continue;      if(is_undefined(nurr=nNext[lsLine[ru][o+1]][nur])) continue;      for(w=0;w<LineSides;w++){	if(nCell[lsCell[ro][w]][nurr]==qq)	  nCell[lsCell[ro][w]][nurr]= qn;      }    }  }  n0 = cNode[lsCell[ru][0]][qq];  n1 = cNode[lsCell[ru][1]][qq];  n2 = cNode[lsCell[ru][2]][qq];  n3 = cNode[lsCell[ru][3]][qq];  if(n1==(nr=nNext[lsLine[ru][1]][n0])){    if(n2==(nr=nNext[lsLine[ru][2]][n1])) return qn;    if(n0==(nl=nNext[lsLine[ru][0]][n3])) return qn;    nNext[lsLine[ru][3]][nr] = nl;    nNext[lsLine[ru][1]][nl] = nr;  }else if(n3==(nl=nNext[lsLine[ru][3]][n2])){    if(n2==(nr=nNext[lsLine[ru][2]][n1])) return qn;    if(n0==(nl=nNext[lsLine[ru][0]][n3])) return qn;    nNext[lsLine[ru][3]][nr] = nl;    nNext[lsLine[ru][1]][nl] = nr;  }else  {    nNext[lsLine[ru][2]][nr] = nl;    nNext[lsLine[ru][0]][nl] = nr;  }  return qn;}

⌨️ 快捷键说明

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