void TriangleSetTopologyContainer::clear() { clearTrianglesAroundVertex(); clearTrianglesAroundEdge(); clearEdgesInTriangle(); clearTriangles(); clearBorderElementLists(); EdgeSetTopologyContainer::clear(); }
void ManifoldTriangleSetTopologyContainer::createEdgeSetArray() { if(!hasTriangles()) // this method should only be called when triangles exist { #ifndef NDEBUG std::cout << "Warning. [ManifoldTriangleSetTopologyContainer::createEdgeSetArray] triangle array is empty." << std::endl; #endif createTriangleSetArray(); } if(hasEdges()) { #ifndef NDEBUG std::cout << "Warning. [ManifoldTriangleSetTopologyContainer::createEdgeSetArray] edge array is not empty." << std::endl; #endif // clear edges and all shells that depend on edges EdgeSetTopologyContainer::clear(); if(hasEdgesInTriangle()) clearEdgesInTriangle(); if(hasTrianglesAroundEdge()) clearTrianglesAroundEdge(); } // create a temporary map to find redundant edges std::map<Edge, unsigned int> edgeMap; helper::WriteAccessor< Data< sofa::helper::vector<Edge> > > m_edge = d_edge; helper::ReadAccessor< Data< sofa::helper::vector<Triangle> > > m_triangle = d_triangle; for (unsigned int i=0; i<m_triangle.size(); ++i) { const Triangle &t = m_triangle[i]; for(unsigned int j=0; j<3; ++j) { const unsigned int v1 = t[(j+1)%3]; const unsigned int v2 = t[(j+2)%3]; const Edge e = ((v1<v2) ? Edge(v1,v2) : Edge(v2,v1)); const Edge real_e = Edge(v1,v2); if(edgeMap.find(e) == edgeMap.end()) { // edge not in edgeMap so create a new one const int edgeIndex = edgeMap.size(); edgeMap[e] = edgeIndex; m_edge.push_back(real_e); } } } }
void TriangleSetTopologyContainer::createTrianglesAroundEdgeArray () { if(!hasTriangles()) // this method should only be called when triangles exist { #ifndef NDEBUG sout << "Warning. [TriangleSetTopologyContainer::createTrianglesAroundEdgeArray] triangle array is empty." << sendl; #endif createTriangleSetArray(); } if(!hasEdges()) // this method should only be called when edges exist { #ifndef NDEBUG sout << "Warning. [TriangleSetTopologyContainer::createTrianglesAroundEdgeArray] edge array is empty." << sendl; #endif createEdgeSetArray(); } if(!hasEdgesInTriangle()) createEdgesInTriangleArray(); const unsigned int numTriangles = getNumberOfTriangles(); const unsigned int numEdges = getNumberOfEdges(); if(hasTrianglesAroundEdge()) { clearTrianglesAroundEdge(); } m_trianglesAroundEdge.resize( numEdges ); for (unsigned int i = 0; i < numTriangles; ++i) { // adding triangle i in the triangle shell of all edges for (unsigned int j=0; j<3; ++j) { m_trianglesAroundEdge[ m_edgesInTriangle[i][j] ].push_back( i ); } } }
void ManifoldTriangleSetTopologyContainer::createTrianglesAroundEdgeArray() { if(!hasTriangles()) // this method should only be called when triangles exist { #ifndef NDEBUG std::cout << "Warning. [ManifoldTriangleSetTopologyContainer::createTrianglesAroundEdgeArray] Triangle array is empty." << std::endl; #endif createTriangleSetArray(); } if(!hasEdges()) // this method should only be called when edges exist { #ifndef NDEBUG std::cout << "Warning. [ManifoldTriangleSetTopologyContainer::createTrianglesAroundEdgeArray] Edge array is empty." << std::endl; #endif createEdgeSetArray(); } if(!hasEdgesInTriangle()) createEdgesInTriangleArray(); if(hasTrianglesAroundEdge()) clearTrianglesAroundEdge(); //Number of different elements needed for this function const unsigned int nbrEdges = getNumberOfEdges(); const unsigned int nbrTriangles = getNumberOfTriangles(); //Temporary objects Triangle vertexTriangle; int cpt; int firstVertex; int vertexInTriangle; //Temporary containers std::multimap<unsigned int, unsigned int> map_edgesInTriangle; std::multimap<unsigned int, unsigned int>::iterator it; std::pair< std::multimap <unsigned int, unsigned int>::iterator, std::multimap <unsigned int, unsigned int>::iterator> pair_equal_range; helper::ReadAccessor< Data< sofa::helper::vector<Edge> > > m_edge = d_edge; helper::ReadAccessor< Data< sofa::helper::vector<Triangle> > > m_triangle = d_triangle; m_trianglesAroundEdge.resize(nbrEdges); for (unsigned int triangleIndex = 0; triangleIndex < nbrTriangles; ++triangleIndex) { // adding triangle i in the triangle shell of all edges for (unsigned int indexEdge = 0; indexEdge<3 ; ++indexEdge) { map_edgesInTriangle.insert(std::pair < unsigned int, unsigned int> (m_edgesInTriangle[triangleIndex][indexEdge], triangleIndex)); } } for (unsigned int indexEdge = 0; indexEdge < nbrEdges; indexEdge++) { cpt = map_edgesInTriangle.count(indexEdge); if (cpt > 2) { #ifndef NDEBUG std::cout << "Error. [ManifoldTriangleSetTopologyContainer::createTrianglesAroundEdgeArray] The mapping is not manifold."; std::cout << "There are more than 2 triangles adjacents to the Edge: " << indexEdge << std::endl; #endif //Even if this structure is not Manifold, we chosed to fill the shell with all the triangles: pair_equal_range = map_edgesInTriangle.equal_range(indexEdge); for (it = pair_equal_range.first; it != pair_equal_range.second; ++it) m_trianglesAroundEdge[indexEdge].push_back((*it).second); } else if (cpt == 1) { it = map_edgesInTriangle.find(indexEdge); m_trianglesAroundEdge[indexEdge].push_back((*it).second); } else if (cpt == 2) { pair_equal_range = map_edgesInTriangle.equal_range(indexEdge); it = pair_equal_range.first; firstVertex = m_edge[indexEdge][0]; vertexTriangle = m_triangle[(*it).second]; vertexInTriangle = getVertexIndexInTriangle (vertexTriangle, firstVertex); if ((unsigned int)m_edge[indexEdge][1] == (unsigned int)vertexTriangle[(vertexInTriangle+1)%3]) { m_trianglesAroundEdge[indexEdge].push_back((*it).second); it++; m_trianglesAroundEdge[indexEdge].push_back((*it).second); } else { it++; m_trianglesAroundEdge[indexEdge].push_back((*it).second); it--; m_trianglesAroundEdge[indexEdge].push_back((*it).second); } } } }