0

私はOpenMeshを使用して、全体が含まれている可能性のあるメッシュを調べ始めており、各エッジに関連付けられている頂点を実際に取得するための良い方法は何かと考えています。

ハーフエッジには、メッシュのメソッドopposite_he_opposite_vhと方法がありopposite_vhますが、反対側のハーフエッジが存在しない場合(現在、境界ハーフエッジにあります)、これらはエラーをトリガーします。

これらに頻繁に遭遇することを考えると、すべてのエッジを反復処理するためのより良い方法は何ですか(実際には、ハーフエッジについては特に気にしません。各エッジのデータを取得しますが、方向は重要ではありません。 2つの頂点が必要ですか)?

4

3 に答える 3

2

私はあなたが使うことができると思います:

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

これらの方法を見つけることができることを確認してください:-)

于 2013-10-07T10:06:21.443 に答える
1

あなたが望むものはこの例かもしれません:

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)));
}
于 2015-01-20T01:29:37.767 に答える
0

他の答えの1つは私にはうまくいきませんでした。b/cイテレータは逆参照する必要がありました。これは、OpenMesh4.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;

}
于 2016-09-21T02:20:17.020 に答える