//---------------------------------------------------------------------------- void MTMesh::AttachTriangleToEdge (int t, MTTriangle& triangle, int i, int e, MTEdge& edge) { if (edge.Triangle(0) == -1) { edge.Triangle(0) = t; } else { int a = edge.Triangle(0); MTTriangle& adjacent = mTriangles[a]; triangle.Adjacent(i) = a; for (int j = 0; j < 3; ++j) { if (adjacent.Edge(j) == e) { adjacent.Adjacent(j) = t; break; } } if (edge.Triangle(1) == -1) { edge.Triangle(1) = t; } else { assertion(false, "The mesh is not manifold.\n"); } } triangle.Edge(i) = e; }
//---------------------------------------------------------------------------- void MTMesh::AttachTriangleToEdge (int iT, MTTriangle& rkT, int i, int iE, MTEdge& rkE) { if ( rkE.Triangle(0) == -1 ) { rkE.Triangle(0) = iT; } else { int iTAdj = rkE.Triangle(0); MTTriangle& rkTAdj = m_akTriangle[iTAdj]; rkT.Adjacent(i) = iTAdj; for (int j = 0; j < 3; j++) { if ( rkTAdj.Edge(j) == iE ) { rkTAdj.Adjacent(j) = iT; break; } } if ( rkE.Triangle(1) == -1 ) { rkE.Triangle(1) = iT; } else { // mesh is not manifold assert( false ); } } rkT.Edge(i) = iE; }
//---------------------------------------------------------------------------- void MTMesh::DetachTriangleFromEdge (int t, MTTriangle& triangle, int i, int e, MTEdge& edge) { // This function leaves T only partially complete. The edge E is no // longer referenced by T, even though the vertices of T reference the // end points of E. If T has an adjacent triangle A that shares E, then // A is a complete triangle. if (edge.Triangle(0) == t) { int a = edge.Triangle(1); if (a != -1) { // T and TAdj share E, update adjacency information for both MTTriangle& adjacent = mTriangles[a]; for (int j = 0; j < 3; ++j) { if (adjacent.Edge(j) == e) { adjacent.Adjacent(j) = -1; break; } } } edge.Triangle(0) = a; } else if (edge.Triangle(1) == t) { // T and TAdj share E, update adjacency information for both MTTriangle& adjacent = mTriangles[edge.Triangle(0)]; for (int j = 0; j < 3; ++j) { if (adjacent.Edge(j) == e) { adjacent.Adjacent(j) = -1; break; } } } else { // Should not get here. The specified edge must share the input // triangle. assertion(false, "Unexpected condition.\n"); } edge.Triangle(1) = -1; triangle.Edge(i) = -1; triangle.Adjacent(i) = -1; }
//---------------------------------------------------------------------------- void MTMesh::DetachTriangleFromEdge (int iT, MTTriangle& rkT, int i, int iE, MTEdge& rkE) { // This function leaves T only partially complete. The edge E is no // longer referenced by T, even though the vertices of T reference the // end points of E. If T has an adjacent triangle A that shares E, then // A is a complete triangle. if ( rkE.Triangle(0) == iT ) { int iTAdj = rkE.Triangle(1); if ( iTAdj != -1 ) { // T and TAdj share E, update adjacency information for both MTTriangle& rkTAdj = m_akTriangle[iTAdj]; for (int j = 0; j < 3; j++) { if ( rkTAdj.Edge(j) == iE ) { rkTAdj.Adjacent(j) = -1; break; } } } rkE.Triangle(0) = iTAdj; } else if ( rkE.Triangle(1) == iT ) { // T and TAdj share E, update adjacency information for both MTTriangle& rkTAdj = m_akTriangle[rkE.Triangle(0)]; for (int j = 0; j < 3; j++) { if ( rkTAdj.Edge(j) == iE ) { rkTAdj.Adjacent(j) = -1; break; } } } else { // Should not get here. The specified edge must share the input // triangle. assert( false ); } rkE.Triangle(1) = -1; rkT.Edge(i) = -1; rkT.Adjacent(i) = -1; }