@@ -264,13 +264,13 @@ void CollisionMesh::init_adjacencies()
264264
265265void  CollisionMesh::init_areas ()
266266{
267-     //   m_vertices_to_edges.resize(num_vertices());
268-     //   for (int i = 0; i < m_edges.rows(); i++) {
269-     //       for (int j = 0; j < m_edges.cols(); j++) {
270-     //           m_vertices_to_edges[m_edges(i, j)].push_back(i);
271-     //       }
272-     //   }
273-     // 
267+     m_vertices_to_edges.resize (num_vertices ());
268+     for  (int  i = 0 ; i < m_edges.rows (); i++) {
269+         for  (int  j = 0 ; j < m_edges.cols (); j++) {
270+             m_vertices_to_edges[m_edges (i, j)].push_back (i);
271+         }
272+     }
273+     
274274    m_vertices_to_faces.resize (num_vertices ());
275275    for  (int  i = 0 ; i < m_faces.rows (); i++) {
276276        for  (int  j = 0 ; j < m_faces.cols (); j++) {
@@ -534,71 +534,46 @@ std::vector<long> CollisionMesh::find_vertex_adjacent_vertices(const long &v) co
534534    }
535535    else 
536536    {
537-         std::unordered_map<long , long > map;
538-         for  (auto  f : vertices_to_faces ()[v])
537+         if  (vertices_to_faces ()[v].size () > 0 )
539538        {
540-             for  (int  lv = 0 ; lv < 3 ; lv++)
539+             //  construct a map of neighboring vertices, it maps every neighbor to the next counter-clockwise neighbor
540+             std::unordered_map<long , long > map;
541+             for  (auto  f : vertices_to_faces ()[v])
541542            {
542-                 if  ( faces ()(f,  lv) == v )
543+                 for  ( int  lv =  0 ; lv <  3 ; lv++ )
543544                {
544-                     map[faces ()(f, (lv+1 )%3 )] = faces ()(f, (lv+2 )%3 );
545-                     break ;
545+                     if  (faces ()(f, lv) == v)
546+                     {
547+                         map[faces ()(f, (lv+1 )%3 )] = faces ()(f, (lv+2 )%3 );
548+                         break ;
549+                     }
546550                }
547551            }
548-         }
549-         if  (vertices_to_faces ()[v].size () != map.size ())
550-             throw  std::runtime_error (" Non-manifold vertex! Map size smaller than neighbor!" 
551-         
552-         auto  iter = map.find (map.begin ()->first );
553-         while  (neighbors.empty () || iter->first  != neighbors.front ())
554-         {
555-             neighbors.push_back (iter->first );
556-             iter = map.find (iter->second );
557-             if  (iter == map.end ())
552+             if  (vertices_to_faces ()[v].size () != map.size ())
553+                 throw  std::runtime_error (" Non-manifold vertex! Map size smaller than neighbor!" 
554+             
555+             //  verify that the neighboring vertices form a loop
556+             auto  iter = map.find (map.begin ()->first );
557+             while  (neighbors.empty () || iter->first  != neighbors.front ())
558558            {
559-                 logger ().error (" neighbor faces {}, map {}" vertices_to_faces ()[v].size (), map);
560-                 throw  std::runtime_error (" Non-manifold vertex! Cannot find next neighbor!" 
561-             }
562-         }
563-         if  (neighbors.size () != map.size ())
564-             throw  std::runtime_error (" Non-manifold vertex!" 
565-     }
566-     return  neighbors;
567- }
568- 
569- // / @brief 
570- // / @param e edge id 
571- // / @return 4 vertices of the 2 faces adjacent to this edge, in the order of [e0, e1, f0, f1]
572- // / the two faces are [f0, e0, e1] and [f1, e1, e0]
573- std::array<long , 4 > CollisionMesh::find_edge_adjacent_vertices (const  long  &e) const 
574- {
575-     std::array<long , 4 > neighbors;
576-     if  (dim () == 2 )
577-         throw  std::runtime_error (" find_edge_adjacent_vertices is only for 3d collision mesh!" 
578-     
579-     std::array<long , 2 > lf = {{edges_to_faces ()(e, 0 ), edges_to_faces ()(e, 1 )}};
580- 
581-     for  (int  j : {0 , 1 })
582-     {
583-         int  i;
584-         for  (i = 0 ; i < 3 ; i++)
585-         {
586-             const  auto  va = faces ()(lf[j], i);
587- 
588-             if  (va != edges ()(e, 0 ) && va != edges ()(e, 1 ))
589-             {
590-                 neighbors[2  + j] = va;
591-                 break ;
559+                 neighbors.push_back (iter->first );
560+                 iter = map.find (iter->second );
561+                 if  (iter == map.end ())
562+                 {
563+                     logger ().error (" neighbor faces {}, map {}" vertices_to_faces ()[v].size (), map);
564+                     throw  std::runtime_error (" Non-manifold vertex! Cannot find next neighbor!" 
565+                 }
592566            }
567+             if  (neighbors.size () != map.size ())
568+                 throw  std::runtime_error (" Non-manifold vertex!" 
593569        }
594- 
595-         if  (j == 0 )
570+         else 
596571        {
597-             neighbors[0 ] = faces ()(lf[j], (i+1 ) % 3 );
598-             neighbors[1 ] = faces ()(lf[j], (i+2 ) % 3 );
572+             for  (int  eid : vertices_to_edges ()[v])
573+                 neighbors.push_back (
574+                     edges ()(eid, 0 ) == v ? edges ()(eid, 1 ) : edges ()(eid, 0 ));
599575        }
600576    }
601- 
602577    return  neighbors;
603578}
604579
0 commit comments