본문 바로가기
OpenMesh

Collapsing Edges

by DarkRock 2024. 11. 11.
반응형

Edge Collapse

Edge Collapse는 메쉬 단순화(simplification)를 위한 기법 중 하나로, 선택한 Edge를 제거하고 그 두 끝점(Vertex)을 하나로 병합하는 과정입니다. 이 작업을 통해 메쉬의 복잡성을 줄이고, 메쉬의 데이터 크기나 연산 부하를 줄일 수 있습니다.

 


코드 예제

아래 그림과 같이 빨간색 edge를 collapse 하는 예제 코드입니다.

Edge Collapse 전

 

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

 

EdgeIterator

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

darkrock.tistory.com

 

반응형

'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