📄 cogrefine.cxx
字号:
#include "cog.hxx"cogFloat xon(const wzPoint& x,const wzPoint& y,const wzPoint& z);// This file defines the standard binary refinement algorithm /*cogIndex Cogeometry::refine(cogFlag1 &f, const cogLine& s) const;cogIndex Cogeometry::refine(cogFlag2& f, const cogFlag1& o, const cogTriangle& s) const;cogIndex Cogeometry::refine(cogFlag3& f, const cogFlag2& o, const cogTetrahedron& s) const; */cogIndex Cogeometry::refine(cogFlag1 &f, const cogLine& s) const{ cogPoint m; cogLine(s.c0,s.c1).barycentre(m); Point(m); cogIndex rc = Line(f,cogLine(s.c0,m)); if(rc==cogRCFaceFound) return rc; return Line(f,cogLine(m,s.c1));}cogIndex Cogeometry::refine(cogFlag2& f, const cogFlag1& o, const cogTriangle& s) const{ cogPoint m2,m0,m1; cogIndex rc,rt; cogLine(s.c1,s.c2).barycentre(m0); Point(m0); cogLine(s.c2,s.c0).barycentre(m1); Point(m1); cogLine(s.c0,s.c1).barycentre(m2); Point(m2); cogFloat sc = m2.scalar(s.c0,o.p1); cogIndex firsttry=1;nexttry: try{ if(sc > 0){ rc=Triangle(f,o,cogTriangle(s.c0,m2,m1)); switch(rc){ case cogRCEdgeFound: return rc; case cogRCFaceFoundOn01: return rc; case cogRCFaceFoundOn02: return rc; case cogRCFaceFoundOn12: rt = 12; break; } }else{ rc=Triangle(f,o,cogTriangle(m2,s.c1,m0)); switch(rc){ case cogRCEdgeFound: return rc; case cogRCFaceFoundOn01: return rc; case cogRCFaceFoundOn12: return rc; case cogRCFaceFoundOn02: rt = 20; break; } } }catch(cogTriangleRoundTripFailed){ if(s.c0.near(o.p1,Delta2D)) throw; if(s.c1.near(o.p1,Delta2D)) throw; if(m2.near(o.p1,Delta2D)){ if(!firsttry){ wzAssert(sc==0); m2.affine(0.4,s.c0,s.c1); sc = m2.scalar(s.c0,o.p1); goto nexttry; } firsttry = 0; sc = -sc; goto nexttry; } throw; //wzAssert(0); } cogPoint h1,h0,ho; cogFlag1 t(h1,h0,ho); int i; i=0; for(;i<30;i++){ t = f; switch(rt){ case 01: rc=Triangle(f,t,cogTriangle(m0,m1,m2)); switch(rc){ case cogRCEdgeFound: return rc; case cogRCFaceFoundOn01: rt = 10; continue; case cogRCFaceFoundOn12: rt = 21; continue; case cogRCFaceFoundOn02: rt = 02; continue; } break; case 10: rc=Triangle(f,t,cogTriangle(m1,m0,s.c2)); switch(rc){ case cogRCEdgeFound: return rc; case cogRCFaceFoundOn01: rt = 01; continue; case cogRCFaceFoundOn12: return cogRCFaceFoundOn12; case cogRCFaceFoundOn02: return cogRCFaceFoundOn02; }break; case 20: rc=Triangle(f,t,cogTriangle(m2,m0,m1)); switch(rc){ case cogRCEdgeFound: return rc; case cogRCFaceFoundOn01: rt = 02; continue; case cogRCFaceFoundOn12: rt = 10; continue; case cogRCFaceFoundOn02: rt = 21; continue; }break; case 02: rc=Triangle(f,t,cogTriangle(m0,m2,s.c1)); switch(rc){ case cogRCEdgeFound: return rc; case cogRCFaceFoundOn01: rt = 20; continue; case cogRCFaceFoundOn12: return cogRCFaceFoundOn01; case cogRCFaceFoundOn02: return cogRCFaceFoundOn12; }break; case 12: rc=Triangle(f,t,cogTriangle(m1,m2,m0)); switch(rc){ case cogRCEdgeFound: return rc; case cogRCFaceFoundOn01: rt = 21; continue; case cogRCFaceFoundOn12: rt = 02; continue; case cogRCFaceFoundOn02: rt = 10; continue; } break; case 21: rc=Triangle(f,t,cogTriangle(m2,m1,s.c0)); switch(rc){ case cogRCEdgeFound: return rc; case cogRCFaceFoundOn01: rt = 12; continue; case cogRCFaceFoundOn12: return cogRCFaceFoundOn02; case cogRCFaceFoundOn02: return cogRCFaceFoundOn01; }break; default: wzAssert(0); } } throw cogErrorFaceLost();}cogIndex Cogeometry::refine(cogFlag3& f, const cogFlag2& o, const cogTetrahedron& s) const{ cogPoint m4,m5,m6,m7,m8,m9; cogIndex rc,rt,incoming; cogFloat vol=s.volume()/2; cogLine(s.c1,s.c2).barycentre(m4); Point(m4); cogLine(s.c2,s.c0).barycentre(m5); Point(m5); cogLine(s.c0,s.c1).barycentre(m6); Point(m6); cogLine(s.c0,s.c3).barycentre(m7); Point(m7); cogLine(s.c1,s.c3).barycentre(m8); Point(m8); cogLine(s.c2,s.c3).barycentre(m9); Point(m9); cogTetrahedron tb0(o.p2,s.c1,s.c2,s.c3); if(tb0.volume()>vol){ incoming = 0; }else{ cogTetrahedron tb1(s.c0,o.p2,s.c2,s.c3); if(tb1.volume()>vol){ incoming = 1; }else{ cogTetrahedron tb2(s.c0,s.c1,o.p2,s.c3); if(tb2.volume()>vol){ incoming = 2; }else{ incoming = 3; } } } cogTetrahedron tb3(s.c0,s.c1,s.c2,o.p2); wzAssert(tb3.volume()<0.01*vol); wzAssert(tb3.volume()>-0.01*vol); switch(incoming){ case 0: rc=Tetrahedron(f,o,cogTetrahedron(s.c0,m6,m5,m7)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: return rc; case cogRCEdgeFoundOn013: return rc; case cogRCEdgeFoundOn023: return rc; case cogRCEdgeFoundOn123: rt = 576; break; }break; case 1: rc=Tetrahedron(f,o,cogTetrahedron(m6,s.c1,m4,m8)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: return rc; case cogRCEdgeFoundOn013: return rc; case cogRCEdgeFoundOn123: return rc; case cogRCEdgeFoundOn023: rt = 468; break; }break; case 2: rc=Tetrahedron(f,o,cogTetrahedron(m5,m4,s.c2,m9)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: return rc; case cogRCEdgeFoundOn023: return rc; case cogRCEdgeFoundOn123: return rc; case cogRCEdgeFoundOn013: rt = 495; break; }break; case 3: rc=Tetrahedron(f,o,cogTetrahedron(m6,m4,m5,m8)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: return rc; case cogRCEdgeFoundOn013: rt = 486; break; case cogRCEdgeFoundOn023: rt = 568; break; case cogRCEdgeFoundOn123: rt = 458; break; }break; } cogPoint h2,h1,h0,ho; cogFlag2 t(h2,h1,h0,ho); for(int i=0;i<50;i++){ t = f; switch(rt){ case 458: rc=Tetrahedron(f,t,cogTetrahedron(m4,m5,m8,m9)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: rt = 485; continue; case cogRCEdgeFoundOn013: rt = 459; continue; case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn123; case cogRCEdgeFoundOn123: rt = 589; continue; }break; case 459: rc=Tetrahedron(f,t,cogTetrahedron(m4,m5,m9,s.c2)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: rt = 495; continue; case cogRCEdgeFoundOn013: return cogRCEdgeFoundOn012; case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn123; case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn023; }break; case 468: rc=Tetrahedron(f,t,cogTetrahedron(m4,m6,m8,m5)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: rt = 486; continue; case cogRCEdgeFoundOn013: return cogRCEdgeFoundOn012; case cogRCEdgeFoundOn023: rt = 458; continue; case cogRCEdgeFoundOn123: rt = 568; continue; }break; case 485: rc=Tetrahedron(f,t,cogTetrahedron(m4,m8,m5,m6)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: rt = 458; continue; case cogRCEdgeFoundOn013: rt = 486; continue; case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn012; case cogRCEdgeFoundOn123: rt = 568; continue; }break; case 486: rc=Tetrahedron(f,t,cogTetrahedron(m4,m8,m6,s.c1)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: rt = 468; continue; case cogRCEdgeFoundOn013: return cogRCEdgeFoundOn123; case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn012; case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn013; }break; case 495: rc=Tetrahedron(f,t,cogTetrahedron(m4,m9,m5,m8)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: rt = 459; continue; case cogRCEdgeFoundOn013: return cogRCEdgeFoundOn123; case cogRCEdgeFoundOn023: rt = 485; continue; case cogRCEdgeFoundOn123: rt = 589; continue; }break; case 567: rc=Tetrahedron(f,t,cogTetrahedron(m5,m6,m7,s.c0)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: rt = 576; continue; case cogRCEdgeFoundOn013: return cogRCEdgeFoundOn012; case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn023; case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn013; }break; case 568: rc=Tetrahedron(f,t,cogTetrahedron(m5,m6,m8,m7)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: rt = 586; continue; case cogRCEdgeFoundOn013: rt = 567; continue; case cogRCEdgeFoundOn023: rt = 578; continue; case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn013; }break; case 576: rc=Tetrahedron(f,t,cogTetrahedron(m5,m7,m6,m8)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: rt = 567; continue; case cogRCEdgeFoundOn013: rt = 578; continue; case cogRCEdgeFoundOn023: rt = 586; continue; case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn013; }break; case 578: rc=Tetrahedron(f,t,cogTetrahedron(m5,m7,m8,m9)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: rt = 587; continue; case cogRCEdgeFoundOn013: return cogRCEdgeFoundOn023; case cogRCEdgeFoundOn023: rt = 598; continue; case cogRCEdgeFoundOn123: rt = 789; continue; }break; case 586: rc=Tetrahedron(f,t,cogTetrahedron(m5,m8,m6,m4)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: rt = 568; continue; case cogRCEdgeFoundOn013: rt = 458; continue; case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn012; case cogRCEdgeFoundOn123: rt = 486; continue; }break; case 587: rc=Tetrahedron(f,t,cogTetrahedron(m5,m8,m7,m6)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: rt = 578; continue; case cogRCEdgeFoundOn013: rt = 586; continue; case cogRCEdgeFoundOn023: rt = 567; continue; case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn013; }break; case 589: rc=Tetrahedron(f,t,cogTetrahedron(m5,m8,m9,m7)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: rt = 598; continue; case cogRCEdgeFoundOn013: rt = 587; continue; case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn023; case cogRCEdgeFoundOn123: rt = 789; continue; }break; case 598: rc=Tetrahedron(f,t,cogTetrahedron(m5,m9,m8,m4)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: rt = 589; continue; case cogRCEdgeFoundOn013: rt = 459; continue; case cogRCEdgeFoundOn023: rt = 485; continue; case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn123; }break; case 789: rc=Tetrahedron(f,t,cogTetrahedron(m7,m8,m9,s.c3)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: rt = 879; continue; case cogRCEdgeFoundOn013: return cogRCEdgeFoundOn013; case cogRCEdgeFoundOn023: return cogRCEdgeFoundOn023; case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn123; }break; case 879: rc=Tetrahedron(f,t,cogTetrahedron(m8,m7,m9,m5)); switch(rc){ case cogRCVertexFound: return rc; case cogRCEdgeFoundOn012: rt = 789; continue; case cogRCEdgeFoundOn013: rt = 587; continue; case cogRCEdgeFoundOn023: rt = 598; continue; case cogRCEdgeFoundOn123: return cogRCEdgeFoundOn023; }break; default: wzAssert(0); } } throw cogErrorEdgeLost();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -