반응형
Non Manifold는 아래 글을 통해 설명했습니다.
2024.01.10 - [3D Algorithm] - Manifold와 Nonmanifold 차이(Mesh Processing)
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 |
---|