OpenMesh найти ребро, соединяющее две вершины

#openmesh

#openmesh

Вопрос:

Есть ли в OpenMesh легкодоступная функция, которая возвращает дескриптор ребра, соединяющий две вершины? Для половинных ребер есть find_halfedge(vertex1, vertex2) функция, но я не смог найти соответствующую find_edge(vertex1, vertex2) функцию. В настоящее время я использую свой собственный, но мне было интересно, есть ли лучший способ, чем этот. По сути, я перебираю окружающие ребра двух вершин и проверяю, куда указывают их полукруги:

 MyMesh::EdgeHandle find_edge(MyMesh amp; mesh, MyMesh::VertexHandle amp; v1, MyMesh::VertexHandle amp; v2 ){
  for (MyMesh::VertexEdgeIter edge =  mesh.ve_iter(v1); edge.is_valid();   edge){
    if( (mesh.from_vertex_handle((*edge).h0())==v1) amp;amp; (mesh.to_vertex_handle((*edge).h0())==v2)){
        return *edge;     
    }
    if( (mesh.from_vertex_handle((*edge).h0())==v2) amp;amp; (mesh.to_vertex_handle((*edge).h0())==v1)){
        return *edge;     
    }
  }
  std::cout<<"No common edge between v1 and v2"<<std::endl;
  MyMesh::EdgeHandle edge_null;
  return edge_null;
}
  

Ответ №1:

Встроенного find_edge метода нет, но вы можете легко создать его find_halfedge , поскольку halfedges знают, к какому краю они принадлежат:

 MyMesh::EdgeHandle find_edge(const MyMeshamp; m, MyMesh::VertexHandle v1, MyMesh::VertexHandle v2)
{
    MyMesh::HalfedgeHandle heh = m.find_halfedge(v1, v2);
    if (heh.is_valid()) {
        return m.edge_handle(heh);
    }
    else {
        return MyMesh::InvalidEdgeHandle;
    }
}