VTK圖形處理之剪下
阿新 • • 發佈:2019-01-22
剪下
與抽取輪廓類似,剪下(Cut)也是指獲取資料集中的部分資料。不過剪下是從一個完全不同的角度來處理的。剪下可以控制資料獲取的區域,而抽取輪廓做不到這一點。
剪下操作需要一把”刀“——隱函式,並且要指剪下的位置——剪下值。給定了這兩個引數後,就確定了切面——隱函式對應的函式曲面。剪下的處理過程是首先將資料集中的點座標帶入隱函式中進行計算,然後將算出的函式值等於剪下值的部分(包括屬性資料)取出來,即已知函式值,求自變數。可以看出,剪下是基於座標的操作。注意,剪下只是剪下了”刀面“部分的資料,並不是將資料集分開。
抽取輪廓與剪下的區別:
- 抽取的輪廓形狀完全取決於資料集中標量資料的分佈;剪下剪下來的形狀則是完全是由”刀“的形狀決定的。
- 抽取輪廓可以設定多個抽取值,產生的各個輪廓形狀一般不相似;剪下也可以設定多個剪下值,但各個剪下結果都=是相似的。
- 同一輪廓上的標量值都是相等,直接進行顏色對映時,輪廓上的顏色只有一種;剪下的結果不存在類似問題。
示例演示
CMakeLists.txt檔案程式碼如下:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(CutExample)
FIND_PACKAGE(VTK REQUIRED)
INCLUDE(${VTK_USE_FILE})
ADD_EXECUTABLE(CutExample cut.cpp)
TARGET_LINK_LIBRARIES (CutExample ${VTK_LIBRARIES})
C++程式碼:
#include "vtkActor.h"
#include "vtkXMLPolyDataReader.h"
#include "vtkCutter.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 "vtkStripper.h"
#include "vtkTriangleFilter.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<vtkCutter> cutEdges = vtkSmartPointer<vtkCutter>::New();
cutEdges->SetInputConnection(cow_normals->GetOutputPort());
cutEdges->SetCutFunction(plane);
cutEdges->GenerateCutScalarsOn();
cutEdges->SetValue(0, 0.5);
vtkSmartPointer<vtkStripper> cutStrips = vtkSmartPointer<vtkStripper>::New();
cutStrips->SetInputConnection(cutEdges->GetOutputPort());
cutStrips->Update();
vtkSmartPointer<vtkPolyData> cutPolyData = vtkSmartPointer<vtkPolyData>::New();
cutPolyData->SetPoints(cutStrips->GetOutput()->GetPoints());
cutPolyData->SetPolys(cutStrips->GetOutput()->GetLines());
vtkSmartPointer<vtkTriangleFilter> cutTriangles = vtkSmartPointer<vtkTriangleFilter>::New();
cutTriangles->SetInputData(cutPolyData);
vtkSmartPointer<vtkPolyDataMapper> cut_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
cut_mapper->SetInputConnection(cutEdges->GetOutputPort());
cut_mapper->ScalarVisibilityOff();
vtkSmartPointer<vtkActor> cut_actor = vtkSmartPointer<vtkActor>::New();
cut_actor->SetMapper(cut_mapper);
cut_actor->GetProperty()->SetColor(1.0, 0.0, 0.0);
vtkSmartPointer<vtkPolyDataMapper> cow_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
cow_mapper->SetInputConnection(cow_normals->GetOutputPort());
cow_mapper->ScalarVisibilityOff();
vtkSmartPointer<vtkActor> cow_actor = vtkSmartPointer<vtkActor>::New();
cow_actor->SetMapper(cow_mapper);
cow_actor->GetProperty()->SetRepresentationToWireframe();
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(cut_actor);
renderer->AddActor(cow_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("CutExample");
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;
}
執行結果:
圖中紅色線是剪下結果。