框选三角面片并改变颜色

// CellRubberBandPick.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "vtkPolyDataReader.h"#include <vtkSmartPointer.h>#include <vtkRendererCollection.h>#include <vtkDataSetMapper.h>#include <vtkUnstructuredGrid.h>#include <vtkIdTypeArray.h>#include <vtkTriangleFilter.h>#include <vtkPolyDataMapper.h>#include <vtkActor.h>#include <vtkCommand.h>#include <vtkRenderWindow.h>#include <vtkRenderer.h>#include <vtkRenderWindowInteractor.h>#include <vtkPolyData.h>#include <vtkPoints.h>#include <vtkCellArray.h>#include <vtkPlaneSource.h>#include <vtkCellPicker.h>#include <vtkProperty.h>#include <vtkObjectFactory.h>#include "vtkDecimatePro.h"#include "vtkSmoothPolyDataFilter.h"#include "vtkPolyDataNormals.h"#include "vtkAppendFilter.h"#include "vtkDataSetCollection.h"#include "vtkCollection.h"#include "vtkType.h"#include "vtkDataSet.h"#include "vtkAreaPicker.h"#include "vtkInteractorStyleRubberBandPick.h"#include "vtkPlanes.h"#include "vtkExtractGeometry.h"// Catch mouse events//对RubberBandPick这种交互方式的继承重写class InteractorStyle : public vtkInteractorStyleRubberBandPick{public:static InteractorStyle* New();vtkTypeMacro(InteractorStyle,vtkInteractorStyleRubberBandPick);InteractorStyle(){selectedMapper = vtkSmartPointer<vtkDataSetMapper>::New();selectedActor = vtkSmartPointer<vtkActor>::New();}virtual void OnLeftButtonUp(){// Forward eventsvtkInteractorStyleRubberBandPick::OnLeftButtonUp();vtkPlanes* frustum = static_cast<vtkAreaPicker*>(this->GetInteractor()->GetPicker())->GetFrustum();vtkSmartPointer<vtkExtractGeometry> extractGeometry =vtkSmartPointer<vtkExtractGeometry>::New();extractGeometry->SetImplicitFunction(frustum);#if VTK_MAJOR_VERSION <= 5extractGeometry->SetInput(this->Data);#elseextractGeometry->SetInputData(this->Data);#endifextractGeometry->Update();this->selectedMapper->SetInputConnection(extractGeometry->GetOutputPort());this->selectedMapper->ScalarVisibilityOff();this->selectedActor->SetMapper(selectedMapper);this->selectedActor->GetProperty()->SetColor(1.0, 0.0, 0.0); //(R,G,B)//this->CurrentRenderer->AddActor(SelectedActor);this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(selectedActor);this->GetInteractor()->GetRenderWindow()->Render();}vtkSmartPointer<vtkPolyData> Data;vtkSmartPointer<vtkDataSetMapper> selectedMapper;vtkSmartPointer<vtkActor> selectedActor;};vtkStandardNewMacro(InteractorStyle);int main (int, char *[]){vtkSmartPointer<vtkPolyDataReader> reader = vtkSmartPointer<vtkPolyDataReader>::New() ; //read vtk polygonal data file ,vtkDataReader是一个专门用来的vtk文件的父类reader->SetFileName("weldedSpheres.vtk");//进行精简reduce the number of triangles in a mesh vtkSmartPointer<vtkDecimatePro> deci = vtkSmartPointer<vtkDecimatePro>::New();deci->SetInputConnection(reader->GetOutputPort());deci->SetTargetReduction(0.9);//Specify the desired reduction in the total number of polygons (e.g., if TargetReduction is set to 0.9, this filter will try to reduce the data set to 10% of its original size). deci->PreserveTopologyOn();//Turn on/off whether to preserve the topology of the original mesh. If on, mesh splitting and hole elimination will not occur. This may limit the maximum reduction that may be achieved. //设置优化 用拉普拉斯平滑来调整点的位置vtkSmartPointer<vtkSmoothPolyDataFilter> smoother= vtkSmartPointer<vtkSmoothPolyDataFilter>::New();smoother->SetInputConnection(deci->GetOutputPort());smoother->SetNumberOfIterations(50);//Specify the number of iterations for Laplacian smoothing//计算多边形网格的法线vtkSmartPointer<vtkPolyDataNormals> normals= vtkSmartPointer<vtkPolyDataNormals>::New();normals->SetInputConnection(smoother->GetOutputPort());normals->FlipNormalsOn();vtkSmartPointer<vtkPolyDataMapper> mapper =vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInput(normals->GetOutput());vtkSmartPointer<vtkActor> actor =vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);actor->GetProperty()->SetColor(1.0,1.0,0.0);vtkSmartPointer<vtkRenderer> renderer =vtkSmartPointer<vtkRenderer>::New();vtkSmartPointer<vtkRenderWindow> renderWindow =vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);vtkSmartPointer<vtkAreaPicker> areaPicker = vtkSmartPointer<vtkAreaPicker>::New();vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =vtkSmartPointer<vtkRenderWindowInteractor>::New();renderWindowInteractor->SetRenderWindow(renderWindow);renderWindowInteractor->SetPicker(areaPicker);renderWindowInteractor->Initialize();// Set the custom stype to use for interaction.vtkSmartPointer<InteractorStyle> style =vtkSmartPointer<InteractorStyle>::New();//style->SetDefaultRenderer(renderer);style->Data = normals->GetOutput();renderWindowInteractor->SetInteractorStyle(style);renderer->AddActor(actor);renderer->ResetCamera();renderer->SetBackground(0.6, 0.8, 0.8); // BluerenderWindow->Render();renderWindowInteractor->Start();return EXIT_SUCCESS;}

,最有效的资本是我们的信誉,它24小时不停为我们工作。

框选三角面片并改变颜色

相关文章:

你感兴趣的文章:

标签云: