cogcube.cxx

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

CXX
222
字号
#include "cog.hxx"

//  This file contains the implementations for cells other than simplices:
/*
cogIndex   Cogeometry::Square(cogFlag2& f, const cogFlag1& o,
         const cogSquare& s) const;
cogIndex   Cogeometry::Cube(cogFlag3& f, const cogFlag2& o,
         const cogCube& c) const;
	 */

cogIndex   Cogeometry::Square(cogFlag2& f, const cogFlag1& o,
         const cogSquare& s) const
{
  cogTriangle t0(s.c0,s.c1,s.c2);
  cogIndex rc = Triangle(f,o,t0);
  cogIndex rt,i;
  switch(rc){
  case cogRCEdgeFound:	return cogRCEdgeFound;
  case cogRCFaceFoundOn01:	return cogRCFaceFoundOn01;
  case cogRCFaceFoundOn02:	rt = 3; break;
  case cogRCFaceFoundOn12:	return cogRCFaceFoundOn12;
  }
  cogTriangle t1(s.c2,s.c0,s.c1);
  cogTriangle t3(s.c0,s.c2,s.c3);
  cogPoint p1,po,p0; cogFlag1 t(p1,p0,po);
  t = f;
  for(i=0;i<5;i++){
    switch(rt){
    case 1:
      rc=Triangle(f,t,t1);
      switch(rc){
      case cogRCEdgeFound:	return cogRCEdgeFound;
      case cogRCFaceFoundOn01:	rt = 3; break;
      case cogRCFaceFoundOn02:	return cogRCFaceFoundOn12;
      case cogRCFaceFoundOn12:	return cogRCFaceFoundOn01;
      }
      break;
    case 3:
      rc=Triangle(f,t,t3);
      switch(rc){
      case cogRCEdgeFound:	return cogRCEdgeFound;
      case cogRCFaceFoundOn01:	rt = 1; break;
      case cogRCFaceFoundOn02:	return cogRCFaceFoundOn03;
      case cogRCFaceFoundOn12:	return cogRCFaceFoundOn23;
      }
      break;
    }
  }
  return cogRCError;
}

cogIndex   Cogeometry::Cube(cogFlag3& f, const cogFlag2& o,
         const cogCube& c) const
{
  cogTetrahedron vol(c.c6,c.c0,c.c2,o.p2);
  cogIndex rc,rt,i;
  if(vol.volume()>0){	// incoming triangle 012
    cogTetrahedron t1(c.c0,c.c1,c.c2,c.c6);
    rc = Tetrahedron(f,o,t1);
    switch(rc){
    case cogRCVertexFound: return rc;
    case cogRCEdgeFoundOn012: return cogRCEdgeFoundOn0123;
    case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn1256;
    case cogRCEdgeFoundOn013: rt = 15; break;
    case cogRCEdgeFoundOn023: rt = 23; break;
    }
  }else{		// incoming triangle 023
    cogTetrahedron t1(c.c0,c.c2,c.c3,c.c6);
    rc = Tetrahedron(f,o,t1);
    switch(rc){
    case cogRCVertexFound: return rc;
    case cogRCEdgeFoundOn012: return cogRCEdgeFoundOn0123;
    case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn2367;
    case cogRCEdgeFoundOn013: rt = 21; break;
    case cogRCEdgeFoundOn023: rt = 37; break;
    }
  }
  cogTetrahedron t15(c.c6,c.c0,c.c1,c.c5);
  cogTetrahedron t54(c.c6,c.c0,c.c5,c.c4);
  cogTetrahedron t47(c.c6,c.c0,c.c4,c.c7);
  cogTetrahedron t73(c.c6,c.c0,c.c7,c.c3);
  cogTetrahedron t32(c.c6,c.c0,c.c3,c.c2);
  cogTetrahedron t21(c.c6,c.c0,c.c2,c.c1);
  cogTetrahedron t51(c.c0,c.c6,c.c5,c.c1);
  cogTetrahedron t45(c.c0,c.c6,c.c4,c.c5);
  cogTetrahedron t74(c.c0,c.c6,c.c7,c.c4);
  cogTetrahedron t37(c.c0,c.c6,c.c3,c.c7);
  cogTetrahedron t23(c.c0,c.c6,c.c2,c.c3);
  cogTetrahedron t12(c.c0,c.c6,c.c1,c.c2);
  cogPoint p2,p1,po,p0; cogFlag2 t(p2,p1,p0,po);
  wzAssert(t21.volume()>0);
  for(i=0;i<20;i++){
    t=f;
    switch(rt){
    case 12:
      rc = Tetrahedron(f,t,t12);
      switch(rc){
      case cogRCVertexFound: return rc;
      case cogRCEdgeFoundOn012: rt = 15; break;
      case cogRCEdgeFoundOn013: rt = 23; break;
      case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn0123;
      case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn1256;
      }
      break;
    case 23:
      rc = Tetrahedron(f,t,t23);
      switch(rc){
      case cogRCVertexFound: return rc;
      case cogRCEdgeFoundOn012: rt = 21; break;
      case cogRCEdgeFoundOn013: rt = 37; break;
      case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn0123;
      case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn2367;
      }
      break;
    case 37:
      rc = Tetrahedron(f,t,t37);
      switch(rc){
      case cogRCVertexFound: return rc;
      case cogRCEdgeFoundOn012: rt = 32; break;
      case cogRCEdgeFoundOn013: rt = 74; break;
      case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn0347;
      case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn2367;
      }
      break;
    case 74:
      rc = Tetrahedron(f,t,t74);
      switch(rc){
      case cogRCVertexFound: return rc;
      case cogRCEdgeFoundOn012: rt = 73; break;
      case cogRCEdgeFoundOn013: rt = 45; break;
      case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn0347;
      case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn4567;
      }
      break;
    case 45:
      rc = Tetrahedron(f,t,t45);
      switch(rc){
      case cogRCVertexFound: return rc;
      case cogRCEdgeFoundOn012: rt = 47; break;
      case cogRCEdgeFoundOn013: rt = 51; break;
      case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn0145;
      case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn4567;
      }
      break;
    case 51:
      rc = Tetrahedron(f,t,t51);
      switch(rc){
      case cogRCVertexFound: return rc;
      case cogRCEdgeFoundOn012: rt = 54; break;
      case cogRCEdgeFoundOn013: rt = 12; break;
      case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn0145;
      case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn1256;
      }
      break;
    case 15:
      rc = Tetrahedron(f,t,t15);
      switch(rc){
      case cogRCVertexFound: return rc;
      case cogRCEdgeFoundOn012: rt = 12; break;
      case cogRCEdgeFoundOn013: rt = 54; break;
      case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn1256;
      case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn0145;
      }
      break;
    case 54:
      rc = Tetrahedron(f,t,t54);
      switch(rc){
      case cogRCVertexFound: return rc;
      case cogRCEdgeFoundOn012: rt = 51; break;
      case cogRCEdgeFoundOn013: rt = 47; break;
      case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn4567;
      case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn0145;
      }
      break;
    case 47:
      rc = Tetrahedron(f,t,t47);
      switch(rc){
      case cogRCVertexFound: return rc;
      case cogRCEdgeFoundOn012: rt = 45; break;
      case cogRCEdgeFoundOn013: rt = 73; break;
      case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn4567;
      case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn0347;
      }
      break;
    case 73:
      rc = Tetrahedron(f,t,t73);
      switch(rc){
      case cogRCVertexFound: return rc;
      case cogRCEdgeFoundOn012: rt = 74; break;
      case cogRCEdgeFoundOn013: rt = 32; break;
      case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn2367;
      case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn0347;
      }
      break;
    case 32:
      rc = Tetrahedron(f,t,t32);
      switch(rc){
      case cogRCVertexFound: return rc;
      case cogRCEdgeFoundOn012: rt = 37; break;
      case cogRCEdgeFoundOn013: rt = 21; break;
      case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn2367;
      case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn0123;
      }
      break;
    case 21:
      rc = Tetrahedron(f,t,t21);
      switch(rc){
      case cogRCVertexFound: return rc;
      case cogRCEdgeFoundOn012: rt = 23; break;
      case cogRCEdgeFoundOn013: rt = 15; break;
      case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn1256;
      case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn0123;
      }
      break;
    default:
      wzAssert(0);
    }
  }
  wzAssert(0);
  return cogRCError;
}

⌨️ 快捷键说明

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