본문 바로가기
OpenMesh

EdgeIterator

by DarkRock 2024. 11. 10.
반응형

EdgeIterator 사용법

EdgeIterator는 OpenMesh에서 메쉬의 모든 Edge(변)를 순회하는 데 사용됩니다. 이를 통해 메쉬에 포함된 모든 Edge를 처음부터 끝까지 방문하면서 특정 작업을 수행하거나, 필요한 정보를 수집할 수 있습니다.

OpenMesh에서는 MyMesh::EdgeIter를 사용해 EdgeIterator를 사용할 수 있습니다. EdgeIterator를 통해 메쉬에 포함된 각 Edge를 하나씩 방문하면서, Edge의 정보를 읽거나 수정할 수 있습니다. 예를 들어, 메쉬의 모든 Edge 길이를 출력하거나 특정 속성을 수정할 때 유용하게 활용됩니다.

 

 

C++ 예제 코드

다음은 OpenMesh에서 EdgeIterator를 사용해 메쉬의 모든 Edge를 순회하며 각 Edge의 길이를 출력하는 간단한 예제입니다.

 

int main() 
{
    MyMesh mesh;
    
    if (!OpenMesh::IO::read_mesh(mesh, "example.obj")) 
    {
        std::cerr << "Error: Cannot read mesh file." << std::endl;
        return 1;
    }

    // EdgeIterator를 이용해 메쉬의 모든 Edge를 순회
    for (MyMesh::EdgeIter e_it = mesh.edges_begin(); e_it != mesh.edges_end(); ++e_it) 
    {        
        MyMesh::HalfedgeHandle heh = mesh.halfedge_handle(*e_it, 0);
        MyMesh::VertexHandle vh1 = mesh.from_vertex_handle(heh);
        MyMesh::VertexHandle vh2 = mesh.to_vertex_handle(heh);
        
        MyMesh::Point p1 = mesh.point(vh1);
        MyMesh::Point p2 = mesh.point(vh2);
        float length = (p1 - p2).length();

        std::cout << "Edge Length: " << length << std::endl;
    }

    return 0;
}

 

 

코드 설명

1. mesh.edges_begin() 함수는 메쉬의 첫 번째 Edge를 가리키는 EdgeIterator를 반환합니다.
2. mesh.edges_end() 함수는 마지막 Edge 다음을 가리키는 EdgeIterator를 반환합니다. 이 위치에 도달하면 순회가 끝납니다.
3. for 루프에서 EdgeIterator를 이용해 각 Edge를 방문하며, Edge의 두 끝점(Vertex)을 가져옵니다.
     - mesh.halfedge_handle(*e_it, 0)을 통해 Edge에 연결된 한쪽 Halfedge를 가져옵니다.
     - mesh.from_vertex_handle(heh)과 mesh.to_vertex_handle(heh)을 통해 두 Vertex 핸들을 얻습니다.
4. 각 Vertex의 위치는 mesh.point()를 사용해 가져올 수 있으며, 이를 통해 Edge의 길이를 계산합니다. length() 함수는 두 위치 벡터 사이의 유클리드 거리(길이)를 반환합니다.
5. 각 Edge의 길이를 콘솔에 출력합니다.

 

이렇게 EdgeIterator를 사용하면 OpenMesh 메쉬 내의 모든 Edge에 접근하여 필요한 작업을 수행할 수 있습니다.

반응형

'OpenMesh' 카테고리의 다른 글

Edge Flip  (0) 2024.11.12
Collapsing Edges  (0) 2024.11.11
VertexIterator  (0) 2024.11.09
Triangle Mesh 기본 구조  (0) 2024.11.08
OpenMesh Split  (0) 2024.10.24