본문 바로가기
VTK

VTK Non Manifold Face 삭제 코드

by DarkRock 2024. 5. 28.
반응형

Non Manifold는 아래 글을 통해 설명했습니다.

2024.01.10 - [3D Algorithm] - Manifold와 Nonmanifold 차이(Mesh Processing)

 

Manifold와 Nonmanifold 차이(Mesh Processing)

Mesh processing에서 manifold와 nonmanifold는 메쉬의 토폴로지(Topology)에 관련된 용어로 사용됩니다. 토폴로지는 한글로 위상이라고 말하는데 Mesh의 vertex, face, edge 연결관계를 나타내며, 임의의 vertex에서

darkrock.tistory.com

 

VTK를 이용해서 Non Manifold face들을 삭제하는 코드는 아래와 같습니다.
face들을 삭제한 후에는 hole이 생기기 때문에 hole filling 등을 이용하여 hole을 채워줘야 합니다.

void deleteNonManifold(vtkPolyData *polydata)
{		
	vtkSmartPointer<vtkFeatureEdges> nmEdges = vtkSmartPointer<vtkFeatureEdges>::New();
	nmEdges->BoundaryEdgesOff();
	nmEdges->FeatureEdgesOff();
	nmEdges->NonManifoldEdgesOn();
	nmEdges->ManifoldEdgesOff();
	nmEdges->SetInputData(polydata);
	nmEdges->Update();

	vtkSmartPointer<vtkPolyData> nmePolyData = nmEdges->GetOutput();	
	vector<bool> flags(polydata->GetNumberOfPoints(), false);
	for (vtkIdType ptId = 0; ptId < nmePolyData->GetNumberOfPoints(); ++ptId)
	{
		double nmePnt[3];
		nmePolyData->GetPoint(ptId, nmePnt);
		vtkIdType vertId = polydata->FindPoint(nmePnt);
		if (vertId != -1)		
			flags[vertId] = true;		
	}	
	vtkSmartPointer<vtkIdList> cellIdList = vtkSmartPointer<vtkIdList>::New();
	for (vtkIdType ptId = 0; ptId < polydata->GetNumberOfPoints(); ++ptId)
	{		
		if (!flags[ptId])	continue;		
		polydata->GetPointCells(ptId, cellIdList);
		for (vtkIdType i = 0; i < cellIdList->GetNumberOfIds(); ++i)		
			polydata->DeleteCell(cellIdList->GetId(i));		
	}
	polydata->RemoveDeletedCells();
}

 

반응형

'VTK' 카테고리의 다른 글

VTK Poisson Reconstruction  (0) 2024.05.27