1. 程式人生 > >VTK圖形處理之剪下

VTK圖形處理之剪下

剪下

  與抽取輪廓類似,剪下(Cut)也是指獲取資料集中的部分資料。不過剪下是從一個完全不同的角度來處理的。剪下可以控制資料獲取的區域,而抽取輪廓做不到這一點。
  剪下操作需要一把”刀“——隱函式,並且要指剪下的位置——剪下值。給定了這兩個引數後,就確定了切面——隱函式對應的函式曲面。剪下的處理過程是首先將資料集中的點座標帶入隱函式中進行計算,然後將算出的函式值等於剪下值的部分(包括屬性資料)取出來,即已知函式值,求自變數。可以看出,剪下是基於座標的操作。注意,剪下只是剪下了”刀面“部分的資料,並不是將資料集分開。

抽取輪廓與剪下的區別:

  1. 抽取的輪廓形狀完全取決於資料集中標量資料的分佈;剪下剪下來的形狀則是完全是由”刀“的形狀決定的。
  2. 抽取輪廓可以設定多個抽取值,產生的各個輪廓形狀一般不相似;剪下也可以設定多個剪下值,但各個剪下結果都=是相似的。
  3. 同一輪廓上的標量值都是相等,直接進行顏色對映時,輪廓上的顏色只有一種;剪下的結果不存在類似問題。

示例演示

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; }

執行結果:

圖中紅色線是剪下結果。

這裡寫圖片描述