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