Перебор ребер и получение их вершин с помощью OpenMesh

Я начинаю использовать OpenMesh для просмотра сеток, которые могут иметь целые части, и мне интересно, как лучше всего получить вершины, связанные с каждым ребром.

Для полуребер существуют методы opposite_he_opposite_vh и opposite_vh меша, но они вызывают ошибку, если противоположного полуребра не существует (в настоящее время мы находимся на граничном полуребре).

Учитывая, что я буду сталкиваться с этим часто, какой лучший способ перебрать все ребра (на самом деле меня не волнует полуребро, я получаю данные для каждого ребра, но направление не имеет значения. Что я нужны две вершины)?


person Alexandre Kaspar    schedule 14.03.2013    source источник


Ответы (3)


Я думаю, вы можете использовать:

  1. MyMesh::to_vertex_handle(MyMesh::HalfedgeHandle)
  2. MyMesh::from_vertex_handle(MyMesh::HalfedgeHandle)

Пожалуйста, подтвердите, что вы можете найти эти методы :-)

person tatsy    schedule 07.10.2013
comment
Подтвержденный. Извините, я уже нашел ответ некоторое время назад, но он может быть полезен для будущих людей, столкнувшихся с той же проблемой. См. openmesh.org/Documentation/OpenMesh-2.4-Documentation/ - person Alexandre Kaspar; 08.10.2013

То, что вы хотите, может быть следующим примером:

for ( mesh_t::EdgeIter eit   = _m.edges_begin(); eit != edgesEnd; ++eit) {
  const MeshType::Point to   = _m.point(_m.to_vertex_handle(_m.halfedge_handle(eit,0)));
  const MeshType::Point from = _m.point(_m.from_vertex_handle(_m.halfedge_handle(eit,0)));
}
person Xianyong Liu    schedule 20.01.2015
comment
Требуется форматирование - person Vikasdeep Singh; 20.01.2015

Один из других ответов не сработал для меня, потому что итераторы нужно было разыменовать. Вот как я это делаю с помощью OpenMesh 4.1
Возможно, лучшие практики несколько изменились; OpenMesh 6.2 уже вышел, но я еще не переключился.

MyMesh mesh;    // create the mesh instance
...             // build your mesh

// use an edge iterator to iterate over all the edges
for (MyMesh::EdgeIter eit = mesh.edges_begin(); eit != mesh.edges_end(); ++eit) 
{       
    // check for boundary.  (one halfedge won't be valid if boundary)
    // note: you have to dereference the edge iterator
    if (!mesh.is_boundary(*eit))
    {
        // if you want vertex handles use:
        auto vh1 = mesh.to_vertex_handle(mesh.halfedge_handle(*eit, 0));
        auto vh2 = mesh.from_vertex_handle(mesh.halfedge_handle(*eit, 0));

        // if you want handles of faces adjacent to the edge use:
        auto fh1 = mesh.face_handle(mesh.halfedge_handle(*eit, 0));
        auto fh2 = mesh.opposite_face_handle(mesh.halfedge_handle(*eit, 0));

        // if you need normal vectors of those faces use:
        auto face1Norm = mesh.normal(fh1);
        auto face2Norm = mesh.normal(fh2);
    }
    else  // boundary.  One of the half edges won't be valid
        std::cout << "found a boundary edge.  skipping it" << std::endl;

}
person user2373786    schedule 21.09.2016