VTK圖形處理之剪裁
阿新 • • 發佈:2019-01-26
剪裁
剪裁的操作基本上和剪下一樣,需要使用一把“刀”(隱函式)並設定剪裁值。輸入的資料集被分成了兩部分:裁下的部分和裁掉的部分。預設只產生裁下的部分這個輸出。
示例演示
CMakeLists.txt檔案程式碼如下:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(ClipExample)
FIND_PACKAGE(VTK REQUIRED)
INCLUDE(${VTK_USE_FILE})
ADD_EXECUTABLE(ClipExample Clip.cpp)
TARGET_LINK_LIBRARIES(ClipExample ${VTK_LIBRARIES} )
C++程式碼:
#include "vtkActor.h"
#include "vtkXMLPolyDataReader.h"
#include "vtkClipPolyData.h"
#include "vtkPlane.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper.h"
#include "vtkPolyDataNormals.h"
#include "vtkProperty.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkSmartPointer.h"
#include "vtkInteractorStyleTrackballCamera.h"
int main()
{
//read input data
vtkSmartPointer<vtkXMLPolyDataReader> reader = vtkSmartPointer<vtkXMLPolyDataReader>::New();
reader->SetFileName("E:\\TestData\\cow.vtp");
vtkSmartPointer< vtkPolyDataNormals> cow_normals = vtkSmartPointer<vtkPolyDataNormals>::New();
cow_normals->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer<vtkPlane> plane = vtkSmartPointer<vtkPlane>::New();
plane->SetOrigin(0.25, 0.0, 0.0);
plane->SetNormal(-1, -1, 0);
vtkSmartPointer<vtkClipPolyData> clipper = vtkSmartPointer<vtkClipPolyData>::New();
clipper->SetInputConnection(cow_normals->GetOutputPort());
clipper->SetClipFunction(plane);
clipper->GenerateClipScalarsOn();
clipper->GenerateClippedOutputOn();
clipper->SetValue(0.5);
vtkSmartPointer<vtkPolyDataMapper> clip_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
clip_mapper->SetInputConnection(clipper->GetOutputPort());
clip_mapper->ScalarVisibilityOff();
vtkSmartPointer<vtkProperty> backProp = vtkSmartPointer<vtkProperty>::New();
backProp->SetDiffuseColor(1.00, 0.388, 0.278);
vtkSmartPointer<vtkActor> clip_actor = vtkSmartPointer<vtkActor>::New();
clip_actor->SetMapper(clip_mapper);
clip_actor->GetProperty()->SetColor(.200, .631, .788);
clip_actor->SetBackfaceProperty(backProp);
vtkSmartPointer<vtkPolyDataMapper> rest_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
rest_mapper->SetInputConnection(clipper->GetClippedOutputPort());
rest_mapper->ScalarVisibilityOff();
vtkSmartPointer<vtkActor> rest_actor = vtkSmartPointer<vtkActor>::New();
rest_actor->SetMapper(rest_mapper);
rest_actor->GetProperty()->SetRepresentationToWireframe();
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(clip_actor);
renderer->AddActor(rest_actor);
renderer->SetBackground(1.0, 1.0, 1.0);
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(renderer);
renWin->SetSize(640, 480);
renWin->Render();
renWin->SetWindowName("ClipExample");
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin);
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
iren->SetInteractorStyle(style);
iren->Initialize();
iren->Start();
return EXIT_SUCCESS;
}
執行結果:
圖中顏色顯示部分是裁下的部分PolyData資料,而裁掉的部分以線框的形式顯示。