/********************************************************************** 文件名: 6.4_PolyDataClosed.cpp Copyright (c) 张晓东, 罗火灵. All rights reserved. 更多信息请访问: http://www.vtkchina.org (VTK中国) http://blog.csdn.net/www_doling_net (东灵工作室) **********************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void GenerateData(vtkSmartPointer input) { vtkSmartPointer sphereSource = vtkSmartPointer::New(); sphereSource->Update(); vtkSmartPointer ids = vtkSmartPointer::New(); ids->SetNumberOfComponents(1); ids->InsertNextValue(2); ids->InsertNextValue(10); vtkSmartPointer selectionNode = vtkSmartPointer::New(); selectionNode->SetFieldType(vtkSelectionNode::CELL); selectionNode->SetContentType(vtkSelectionNode::INDICES); selectionNode->SetSelectionList(ids); selectionNode->GetProperties()->Set(vtkSelectionNode::INVERSE(), 1); vtkSmartPointer selection = vtkSmartPointer::New(); selection->AddNode(selectionNode); vtkSmartPointer extractSelection = vtkSmartPointer::New(); extractSelection->SetInput(0, sphereSource->GetOutput()); extractSelection->SetInput(1, selection); extractSelection->Update(); vtkSmartPointer surfaceFilter = vtkSmartPointer::New(); surfaceFilter->SetInputConnection(extractSelection->GetOutputPort()); surfaceFilter->Update(); input->ShallowCopy(surfaceFilter->GetOutput()); } int main(int argc, char *argv[]) { vtkSmartPointer input = vtkSmartPointer::New(); GenerateData(input); vtkSmartPointer featureEdges = vtkSmartPointer::New(); featureEdges->SetInput(input); featureEdges->BoundaryEdgesOn(); featureEdges->FeatureEdgesOff(); featureEdges->ManifoldEdgesOff(); featureEdges->NonManifoldEdgesOff(); featureEdges->Update(); int numberOfOpenEdges = featureEdges->GetOutput()->GetNumberOfCells(); if(numberOfOpenEdges) { std::cout<<"该网格模型不是封闭的..."< fillHolesFilter = vtkSmartPointer::New(); fillHolesFilter->SetInput(input); fillHolesFilter->Update(); vtkSmartPointer normals = vtkSmartPointer::New(); normals->SetInputConnection(fillHolesFilter->GetOutputPort()); normals->ConsistencyOn(); normals->SplittingOff(); normals->Update(); ////////////////////////////////////////////////////////////////////////// double leftViewport[4] = {0.0, 0.0, 0.5, 1.0}; double rightViewport[4] = {0.5, 0.0, 1.0, 1.0}; vtkSmartPointer originalMapper = vtkSmartPointer::New(); originalMapper->SetInput(input); vtkSmartPointer backfaceProp = vtkSmartPointer::New(); backfaceProp->SetDiffuseColor(0.89,0.81,0.34); vtkSmartPointer originalActor = vtkSmartPointer::New(); originalActor->SetMapper(originalMapper); originalActor->SetBackfaceProperty(backfaceProp); originalActor->GetProperty()->SetDiffuseColor(1.0, 0.3882, 0.2784); vtkSmartPointer edgeMapper = vtkSmartPointer::New(); edgeMapper->SetInput(featureEdges->GetOutput()); vtkSmartPointer edgeActor = vtkSmartPointer::New(); edgeActor->SetMapper(edgeMapper); edgeActor->GetProperty()->SetEdgeColor(0.,0.,1.0); edgeActor->GetProperty()->SetEdgeVisibility(1); edgeActor->GetProperty()->SetLineWidth(5); vtkSmartPointer filledMapper = vtkSmartPointer::New(); filledMapper->SetInput(normals->GetOutput()); vtkSmartPointer filledActor = vtkSmartPointer::New(); filledActor->SetMapper(filledMapper); filledActor->GetProperty()->SetDiffuseColor(1.0, 0.3882, 0.2784); vtkSmartPointer leftRenderer = vtkSmartPointer::New(); leftRenderer->SetViewport(leftViewport); leftRenderer->AddActor(originalActor); leftRenderer->AddActor(edgeActor); leftRenderer->SetBackground(1.0, 1.0, 1.0); vtkSmartPointer rightRenderer = vtkSmartPointer::New(); rightRenderer->SetViewport(rightViewport); rightRenderer->AddActor(filledActor); rightRenderer->SetBackground(1.0, 1.0, 1.0); vtkSmartPointer renderWindow = vtkSmartPointer::New(); renderWindow->AddRenderer(leftRenderer); renderWindow->AddRenderer(rightRenderer); renderWindow->SetSize(640, 320); renderWindow->Render(); renderWindow->SetWindowName("PolyDataClosed"); vtkSmartPointer renderWindowInteractor = vtkSmartPointer::New(); renderWindowInteractor->SetRenderWindow(renderWindow); leftRenderer->GetActiveCamera()->SetPosition(0, -1, 0); leftRenderer->GetActiveCamera()->SetFocalPoint(0, 0, 0); leftRenderer->GetActiveCamera()->SetViewUp(0, 0, 1); leftRenderer->GetActiveCamera()->Azimuth(30); leftRenderer->GetActiveCamera()->Elevation(30); leftRenderer->ResetCamera(); rightRenderer->SetActiveCamera(leftRenderer->GetActiveCamera()); renderWindow->Render(); renderWindowInteractor->Start(); return EXIT_SUCCESS; }