const TriangleSetTopologyContainer::TrianglesAroundEdge& TriangleSetTopologyContainer::getTrianglesAroundEdge(EdgeID i) { if(!hasTrianglesAroundEdge()) // this method should only be called when the shell array exists { #ifndef NDEBUG sout << "Warning. [TriangleSetTopologyContainer::getTrianglesAroundEdge] triangle edge shell array is empty." << sendl; #endif createTrianglesAroundEdgeArray(); } else if( i >= m_trianglesAroundEdge.size()) { #ifndef NDEBUG sout << "Error. [TriangleSetTopologyContainer::getTrianglesAroundEdge] index out of bounds." << sendl; #endif createTrianglesAroundEdgeArray(); } return m_trianglesAroundEdge[i]; }
sofa::helper::vector< unsigned int > &TriangleSetTopologyContainer::getTrianglesAroundEdgeForModification(const unsigned int i) { if(!hasTrianglesAroundEdge()) // this method should only be called when the shell array exists { #ifndef NDEBUG sout << "Warning. [TriangleSetTopologyContainer::getTrianglesAroundEdgeForModification] triangle edge shell array is empty." << sendl; #endif createTrianglesAroundEdgeArray(); } if( i >= m_trianglesAroundEdge.size()) { #ifndef NDEBUG sout << "Error. [TriangleSetTopologyContainer::getTrianglesAroundEdgeForModification] index out of bounds." << sendl; #endif createTrianglesAroundEdgeArray(); } return m_trianglesAroundEdge[i]; }
const sofa::helper::vector< sofa::helper::vector<unsigned int> > &TriangleSetTopologyContainer::getTrianglesAroundEdgeArray() { if(!hasTrianglesAroundEdge()) // this method should only be called when the shell array exists { #ifndef NDEBUG sout << "Warning. [TriangleSetTopologyContainer::getTrianglesAroundEdgeArray] triangle edge shell array is empty." << sendl; #endif createTrianglesAroundEdgeArray(); } return m_trianglesAroundEdge; }
void TriangleSetTopologyContainer::createElementsOnBorder() { if(!hasTrianglesAroundEdge()) // Use the trianglesAroundEdgeArray. Should check if it is consistent { #ifndef NDEBUG std::cout << "Warning. [TriangleSetTopologyContainer::createElementsOnBorder] Triangle edge shell array is empty." << std::endl; #endif createTrianglesAroundEdgeArray(); } if(!m_trianglesOnBorder.empty()) m_trianglesOnBorder.clear(); if(!m_edgesOnBorder.empty()) m_edgesOnBorder.clear(); if(!m_pointsOnBorder.empty()) m_pointsOnBorder.clear(); const unsigned int nbrEdges = getNumberOfEdges(); bool newTriangle = true; bool newEdge = true; bool newPoint = true; helper::ReadAccessor< Data< sofa::helper::vector<Edge> > > m_edge = d_edge; for (unsigned int i = 0; i < nbrEdges; i++) { if (m_trianglesAroundEdge[i].size() == 1) // I.e this edge is on a border { // --- Triangle case --- for (unsigned int j = 0; j < m_trianglesOnBorder.size(); j++) // Loop to avoid duplicated indices { if (m_trianglesOnBorder[j] == m_trianglesAroundEdge[i][0]) { newTriangle = false; break; } } if(newTriangle) // If index doesn't already exist, add it to the list of triangles On border. { m_trianglesOnBorder.push_back (m_trianglesAroundEdge[i][0]); } // --- Edge case --- for (unsigned int j = 0; j < m_edgesOnBorder.size(); j++) // Loop to avoid duplicated indices { if (m_edgesOnBorder[j] == i) { newEdge = false; break; } } if(newEdge) // If index doesn't already exist, add it to the list of edges On border. { m_edgesOnBorder.push_back (i); } // --- Point case --- PointID firstVertex = m_edge[i][0]; for (unsigned int j = 0; j < m_pointsOnBorder.size(); j++) // Loop to avoid duplicated indices { if (m_pointsOnBorder[j] == firstVertex) { newPoint = false; break; } } if(newPoint) // If index doesn't already exist, add it to the list of points On border. { m_pointsOnBorder.push_back (firstVertex); } newTriangle = true; //reinitialize tests variables newEdge = true; newPoint = true; } } }
int ManifoldTriangleSetTopologyContainer::getOppositeTrianglesAroundEdge(EdgeID edgeIndex, TriangleID triangleIndex) { if(!hasTrianglesAroundEdge()) // this method should only be called when the shell array exists { #ifndef NDEBUG std::cout << "Warning. [ManifoldTriangleSetTopologyContainer::getOppositeTrianglesAroundEdge] Triangle edge shell array is empty." << std::endl; #endif createTrianglesAroundEdgeArray(); } if (edgeIndex >= m_trianglesAroundEdge.size()) { #ifndef NDEBUG std::cout << "Error. [ManifoldTriangleSetTopologyContainer::getOppositeTrianglesAroundEdge] Edge Index out of bounds." << std::endl; #endif return -2; } if (triangleIndex >= (d_triangle.getValue()).size()) { #ifndef NDEBUG std::cout << "Error. [ManifoldTriangleSetTopologyContainer::getNextTrianglesAroundVertex] Triangle index out of bounds." << std::endl; #endif return -2; } if (m_trianglesAroundEdge[edgeIndex].size() > 2) { #ifndef NDEBUG std::cout << "Error. [ManifoldTriangleSetTopologyContainer::getOppositeTrianglesAroundEdge] The mapping is not manifold."; std::cout << "There are more than 2 triangles adjacents to the Edge: " << edgeIndex << std::endl; #endif return -2; } else if (m_trianglesAroundEdge[edgeIndex].size() == 1) { #ifndef NDEBUG std::cout << "Warning. [ManifoldTriangleSetTopologyContainer::getOppositeTrianglesAroundEdge] No triangle has been returned. Input Edge belongs to the border." << std::endl; #endif return -1; } else if (m_trianglesAroundEdge[edgeIndex][0] == triangleIndex) { return m_trianglesAroundEdge[edgeIndex][1]; } else if (m_trianglesAroundEdge[edgeIndex][1] == triangleIndex) { return m_trianglesAroundEdge[edgeIndex][0]; } #ifndef NDEBUG std::cout << "Error. [ManifoldTriangleSetTopologyContainer::getOppositeTrianglesAroundEdge] No Triangle has been returned." << std::endl; #endif return -2; }