HalfedgeIterator 사용법
HalfedgeIterator는 OpenMesh에서 메쉬의 모든 Halfedge를 순회하는 데 사용됩니다. Halfedge는 OpenMesh의 가장 기본적인 요소 중 하나로, 각 Edge를 두 개의 방향성 있는 Halfedge로 나누어 메쉬를 관리합니다. Halfedge는 메쉬의 Topology와 관련된 많은 정보를 담고 있기 때문에, 메쉬의 구조를 분석하거나 변형하는 데 매우 유용합니다.
Halfedge 개념은 아래글을 참고하세요.
2023.11.29 - [OpenMesh] - Halfedge Data Structure(반모서리 자료구조)
C++ 예제 코드
다음은 OpenMesh에서 HalfedgeIterator를 사용해 메쉬의 모든 Halfedge를 순회하면서 각 Halfedge의 시작점과 끝점 Vertex 정보를 출력하는 간단한 예제입니다.
MyMesh mesh;
if (!OpenMesh::IO::read_mesh(mesh, "example.obj"))
{
std::cerr << "Error: Cannot read mesh file." << std::endl;
return 1;
}
for (MyMesh::HalfedgeIter he_it = mesh.halfedges_begin(); he_it != mesh.halfedges_end(); ++he_it)
{
MyMesh::VertexHandle from_vh = mesh.from_vertex_handle(*he_it);
MyMesh::VertexHandle to_vh = mesh.to_vertex_handle(*he_it);
MyMesh::Point from_pos = mesh.point(from_vh);
MyMesh::Point to_pos = mesh.point(to_vh);
std::cout << "Halfedge from Vertex ID: " << from_vh.idx()
<< " (Position: " << from_pos[0] << ", " << from_pos[1] << ", " << from_pos[2] << ")"
<< " to Vertex ID: " << to_vh.idx()
<< " (Position: " << to_pos[0] << ", " << to_pos[1] << ", " << to_pos[2] << ")" << std::endl;
}
코드 설명
- mesh.halfedges_begin()과 mesh.halfedges_end()를 사용해 메쉬의 첫 번째 Halfedge부터 마지막 Halfedge까지 순회합니다. 이 이터레이터는 각 Halfedge를 방문하면서, 해당 Halfedge와 관련된 정보를 얻을 수 있습니다.
- mesh.from_vertex_handle(*he_it)과 mesh.to_vertex_handle(*he_it)를 사용해 각 Halfedge의 시작점(Vertex)과 끝점(Vertex) 핸들을 가져옵니다.
- mesh.point(from_vh)와 mesh.point(to_vh)를 사용하여 시작점과 끝점 Vertex의 위치 좌표를 얻을 수 있습니다.
- 각 Halfedge의 시작점과 끝점 Vertex ID와 좌표를 출력합니다.
HalfedgeIterator 활용
HalfedgeIterator는 메쉬의 구조를 세밀하게 탐색하거나 분석하는 데 유용합니다. 각 Halfedge는 방향성이 있으므로, Edge에 대해 방향성을 고려한 작업을 수행할 수 있습니다. 예를 들어, 메쉬의 특정 방향에 따라 Edge 정보를 수집하거나, Edge의 방향에 따른 정점 간 거리를 계산할 때 사용할 수 있습니다.
'OpenMesh' 카테고리의 다른 글
VertexFaceIter (1) | 2024.11.16 |
---|---|
VertexVertexIter (0) | 2024.11.15 |
FaceIterator (0) | 2024.11.13 |
Edge Flip (0) | 2024.11.12 |
Collapsing Edges (0) | 2024.11.11 |