반응형
Edge Collapse
Edge Collapse는 메쉬 단순화(simplification)를 위한 기법 중 하나로, 선택한 Edge를 제거하고 그 두 끝점(Vertex)을 하나로 병합하는 과정입니다. 이 작업을 통해 메쉬의 복잡성을 줄이고, 메쉬의 데이터 크기나 연산 부하를 줄일 수 있습니다.
코드 예제
아래 그림과 같이 빨간색 edge를 collapse 하는 예제 코드입니다.
collapse 할 edge 길이는 0.233이며, 이 edge를 찾기 위해 if 문을 사용했습니다.
cout 하는 부분은 collapse 할 edge 두 점이 한 개의 점으로 합쳐지는 것을 확인하기 위한 코드입니다.
MyMesh mesh;
if (!OpenMesh::IO::read_mesh(mesh, "Mesh.stl"))
{
std::cerr << "read error\n";
exit(1);
}
mesh.request_vertex_status();
mesh.request_edge_status();
mesh.request_face_status();
MyMesh::EdgeIter e_it = mesh.edges_sbegin();
MyMesh::EdgeIter e_end = mesh.edges_end();
for (; e_it != e_end; e_it++)
{
float len = mesh.calc_edge_length(*e_it);
if (len < 0.235)
{
MyMesh::HalfedgeHandle he = mesh.halfedge_handle(*e_it, 0);
if (mesh.is_collapse_ok(he))
{
MyMesh::VertexHandle vh_to = mesh.to_vertex_handle(he);
MyMesh::VertexHandle vh_from = mesh.from_vertex_handle(he);
cout << mesh.point(vh_to) << endl;
cout << mesh.point(vh_from) << endl;
mesh.collapse(he);
vh_to = mesh.to_vertex_handle(he);
vh_from = mesh.from_vertex_handle(he);
cout << mesh.point(vh_to) << endl;
cout << mesh.point(vh_from) << endl;
}
}
}
mesh.garbage_collection();
Edge를 순회하는 코드 설명은 아래 글을 참고하세요.
2024.11.10 - [OpenMesh] - EdgeIterator
반응형
'OpenMesh' 카테고리의 다른 글
FaceIterator (0) | 2024.11.13 |
---|---|
Edge Flip (0) | 2024.11.12 |
EdgeIterator (1) | 2024.11.10 |
VertexIterator (0) | 2024.11.09 |
Triangle Mesh 기본 구조 (0) | 2024.11.08 |