void TriangleSetTopologyContainer::createTrianglesAroundVertexArray () { if(!hasTriangles()) // this method should only be called when triangles exist { #ifndef NDEBUG sout << "Warning. [TriangleSetTopologyContainer::createTrianglesAroundVertexArray] triangle array is empty." << sendl; #endif createTriangleSetArray(); } if(hasTrianglesAroundVertex()) { clearTrianglesAroundVertex(); } m_trianglesAroundVertex.resize( getNbPoints() ); helper::ReadAccessor< Data< sofa::helper::vector<Triangle> > > m_triangle = d_triangle; for (unsigned int i = 0; i < m_triangle.size(); ++i) { // adding edge i in the edge shell of both points for (unsigned int j=0; j<3; ++j) m_trianglesAroundVertex[ m_triangle[i][j] ].push_back( i ); } }
void TriangleSetTopologyContainer::clear() { clearTrianglesAroundVertex(); clearTrianglesAroundEdge(); clearEdgesInTriangle(); clearTriangles(); clearBorderElementLists(); EdgeSetTopologyContainer::clear(); }
void ManifoldTriangleSetTopologyContainer::createTrianglesAroundVertexArray () { if(!hasTriangles()) // this method should only be called when triangles exist { #ifndef NDEBUG std::cout << "Warning. [ManifoldTriangleSetTopologyContainer::createTrianglesAroundVertexArray] triangle array is empty." << std::endl; #endif createTriangleSetArray(); } if(hasTrianglesAroundVertex()) { clearTrianglesAroundVertex(); } //Number of different elements needed for this function const unsigned int nbrVertices = getNbPoints(); const unsigned int nbrTriangles = getNumberOfTriangles(); //Temporary objects Triangle vertexTriangle; unsigned int cpt; unsigned int firstVertex; //Temporary containers sofa::helper::vector< std::map<unsigned int, unsigned int> > map_Triangles; sofa::helper::vector< std::map<unsigned int, unsigned int> > map_NextVertex; sofa::helper::vector< std::map<unsigned int, unsigned int> > map_PreviousVertex; std::map<unsigned int, unsigned int>::iterator it1; std::map<unsigned int, unsigned int>::iterator it2; m_trianglesAroundVertex.resize(nbrVertices); map_Triangles.resize(nbrVertices); map_NextVertex.resize(nbrVertices); map_PreviousVertex.resize(nbrVertices); /* Creation of the differents maps: For each vertex i of each triangles: - map_Triangles: key = vertex i+1, value = index triangle - map_Nextvertex: key = vertex i+1, value = vertex i+2 - map_PreviousVertex: key = vertex i+2, value = vertex i+1 */ for (unsigned int triangleIndex = 0; triangleIndex < nbrTriangles; ++triangleIndex) { vertexTriangle = getTriangleArray()[triangleIndex]; for (unsigned int i=0; i<3; ++i) { map_Triangles[vertexTriangle[i]].insert(std::pair<unsigned int,unsigned int> (vertexTriangle[(i+1)%3], triangleIndex)); //multi map_NextVertex[vertexTriangle[i]].insert(std::pair<unsigned int,unsigned int> (vertexTriangle[(i+1)%3], vertexTriangle[(i+2)%3])); map_PreviousVertex[vertexTriangle[i]].insert(std::pair<unsigned int,unsigned int> (vertexTriangle[(i+2)%3], vertexTriangle[(i+1)%3])); } } // General loop for m_trianglesAroundVertex creation for (unsigned int vertexIndex = 0; vertexIndex < nbrVertices; ++vertexIndex) { it1 = map_NextVertex[vertexIndex].begin(); firstVertex = (*it1).first; for (it1 = map_NextVertex[vertexIndex].begin(); it1 != map_NextVertex[vertexIndex].end(); ++it1) { it2 = map_PreviousVertex[vertexIndex].find((*it1).first); if (it2 == map_PreviousVertex[vertexIndex].end()) //it2 didn't find the it1 correspondant element in his map, means it's a border { firstVertex = (*it1).first; break; }//else we are not on a border. we keep the initialised value for firstVertex } m_trianglesAroundVertex[vertexIndex].push_back(map_Triangles[vertexIndex][firstVertex]); cpt=1; for (unsigned int i = 1; i < map_NextVertex[vertexIndex].size(); ++i) { it2 = map_NextVertex[vertexIndex].find(firstVertex); if (((*it2).first == firstVertex) && (it2 == map_NextVertex[vertexIndex].end())) { // Contour has been done without reaching the end of the map break; } firstVertex = (*it2).second; m_trianglesAroundVertex[vertexIndex].push_back(map_Triangles[vertexIndex][firstVertex]); cpt++; } if (cpt != map_Triangles[vertexIndex].size()) { #ifndef NDEBUG std::cout << "Error. [ManifoldTriangleSetTopologyContainer::createEdgesAroundVertexArray] The mapping is not manifold."; std::cout << "There is a wrong connection between triangles adjacent to the vertex: "<< vertexIndex << std::endl; #endif } } map_Triangles.clear(); map_NextVertex.clear(); map_PreviousVertex.clear(); }