Перебирая края и получая их вершины с OpenMesh

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

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

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

0

Решение

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

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

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

2

Другие решения

То, что вы хотите, может быть этот пример:

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)));
}
1

Один из других ответов не работал для меня, итераторы b / c нужно было разыменовать.
Вот как я это делаю, используя 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;

}
0
По вопросам рекламы [email protected]