OpenMesh:获取边界半边的句柄
OpenMesh: Get handle to a boundary halfedge
我有一个关于 C++ 库的非常简单的问题 OpenMesh。令人惊讶的是,我没有在任何地方找到答案。
对于给定的网格,我想沿着网格边界迭代。从documentation我知道:
You can iterate along boundaries by using the next_halfedge_handle(). If you are on a boundary, the next halfedge is guaranteed to be also a boundary halfedge.
到目前为止,很清楚。但是我如何获得初始边界半边,以便从那时起我可以使用 next_halfedge_handle()
呢?我真的必须遍历所有半边才能找到一个在边界上吗?
非常感谢您的帮助。
是的。
"Mesh" 只是多边形(通常是三角形)及其 local 连通性的集合。如果不明确寻找边界,实际上没有任何方法可以知道边界在哪里(甚至有多少,或者如果有的话)。
迭代自己很简单。但是,您确实需要考虑到可能存在多个边界(如孔)。因此,识别所有边界然后选择您感兴趣的边界可能是明智的。
typedef OpenMesh::TriMesh_ArrayKernelT<> Mesh;
typedef std::shared_ptr<MeshUtils::Mesh> MeshPtr;
typedef OpenMesh::HalfedgeHandle HEdgeHandle;
std::vector<HEdgeHandle> EnumerateBoundryCycles(MeshPtr mesh)
{
vector<HEdgeHandle> cycles_all;
size_t maxItr(mesh->n_halfedges());
mesh->request_halfedge_status();
for (auto he_itr = mesh->halfedges_begin(); he_itr != mesh->halfedges_end(); ++he_itr)
mesh->status(he_itr).set_tagged(false);
for (auto he_itr = mesh->halfedges_begin(); he_itr != mesh->halfedges_end(); ++he_itr)
{
if (mesh->status(he_itr).tagged())
continue;
mesh->status(he_itr).set_tagged(true);
if (false == mesh->is_boundary(he_itr))
continue;
// boundry found
cycles_all.push_back(*he_itr);
size_t counter = 1;
auto next_he = mesh->next_halfedge_handle(he_itr);
while ( (next_he != he_itr) && counter < maxItr)
{
assert(mesh->is_boundary(next_he));
assert(false == mesh->status(next_he).tagged());
mesh->status(next_he).set_tagged(true);
next_he = mesh->next_halfedge_handle(next_he);
counter++;
}
std::cout << "[EnumerateBoundryCycles]: Found cycle of length " << counter << std::endl;
if (counter >= maxItr)
{
std::cout << "WRN [EnumerateBoundryCycles]: Failed to close boundry loop." << std::endl;
assert(false);
}
}
mesh->release_halfedge_status();
return cycles_all;
}
我有一个关于 C++ 库的非常简单的问题 OpenMesh。令人惊讶的是,我没有在任何地方找到答案。
对于给定的网格,我想沿着网格边界迭代。从documentation我知道:
You can iterate along boundaries by using the next_halfedge_handle(). If you are on a boundary, the next halfedge is guaranteed to be also a boundary halfedge.
到目前为止,很清楚。但是我如何获得初始边界半边,以便从那时起我可以使用 next_halfedge_handle()
呢?我真的必须遍历所有半边才能找到一个在边界上吗?
非常感谢您的帮助。
是的。
"Mesh" 只是多边形(通常是三角形)及其 local 连通性的集合。如果不明确寻找边界,实际上没有任何方法可以知道边界在哪里(甚至有多少,或者如果有的话)。
迭代自己很简单。但是,您确实需要考虑到可能存在多个边界(如孔)。因此,识别所有边界然后选择您感兴趣的边界可能是明智的。
typedef OpenMesh::TriMesh_ArrayKernelT<> Mesh;
typedef std::shared_ptr<MeshUtils::Mesh> MeshPtr;
typedef OpenMesh::HalfedgeHandle HEdgeHandle;
std::vector<HEdgeHandle> EnumerateBoundryCycles(MeshPtr mesh)
{
vector<HEdgeHandle> cycles_all;
size_t maxItr(mesh->n_halfedges());
mesh->request_halfedge_status();
for (auto he_itr = mesh->halfedges_begin(); he_itr != mesh->halfedges_end(); ++he_itr)
mesh->status(he_itr).set_tagged(false);
for (auto he_itr = mesh->halfedges_begin(); he_itr != mesh->halfedges_end(); ++he_itr)
{
if (mesh->status(he_itr).tagged())
continue;
mesh->status(he_itr).set_tagged(true);
if (false == mesh->is_boundary(he_itr))
continue;
// boundry found
cycles_all.push_back(*he_itr);
size_t counter = 1;
auto next_he = mesh->next_halfedge_handle(he_itr);
while ( (next_he != he_itr) && counter < maxItr)
{
assert(mesh->is_boundary(next_he));
assert(false == mesh->status(next_he).tagged());
mesh->status(next_he).set_tagged(true);
next_he = mesh->next_halfedge_handle(next_he);
counter++;
}
std::cout << "[EnumerateBoundryCycles]: Found cycle of length " << counter << std::endl;
if (counter >= maxItr)
{
std::cout << "WRN [EnumerateBoundryCycles]: Failed to close boundry loop." << std::endl;
assert(false);
}
}
mesh->release_halfedge_status();
return cycles_all;
}