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 |