vtk中的剪裁

2021-10-25 02:41:18 字數 1635 閱讀 5902

在vtk中,我們通常需要的並不是嚴格標準的幾何體,我們需要對這些幾何體進行加工,修改其內容,得到我們想要的效果,下面結合例子介紹如何在vtk中實現對幾何體的裁剪。要對幾何體進行裁剪,需要建立好幾何體模型,然後定義乙個隱函式,利用vtkclippolydata,通過隱函式vtkimplicitfunction實現對模型的裁剪,在vtk中,類似vtkplane,vtksphere,vtkcylinder這些後面沒有source的類,都是隱函式類。

#include "vtkactor.h"

#include "vtkrenderer.h"

#include "vtkrenderwindow.h"

#include "vtkrenderwindowinteractor.h"

#include "vtkcylinder.h"

#include "vtkplane.h"

#include "vtkimplicitboolean.h"

#include "vtkspheresource.h"

#include "vtkproperty.h"

#include "vtkclippolydata.h"

#include "vtktransformpolydatafilter.h"

#include "vtktransform.h"

#include "vtkinteractorstyletrackballcamera.h"

int main()

其中1~14行包含相應標頭檔案

18~22行定義乙個球,其圓心在原點,半徑為10,設定經緯方向的三角片數均為40;

24~26行定義圓柱的隱函式,設定半徑為3,中心在原點,在vtk中的圓柱隱函式是沒有設定長度的,其方向為沿y軸方向,此處的圓柱用於對剛才定義的球進行裁剪,裁剪效果就是把球給打通了,兩面都進行的裁剪,如果要只裁剪球的一面,則用半個圓柱。接下來的28~30行定義了乙個平面,用平面與圓柱求交可得出半個圓柱。

32~35行將平面和圓柱進行bool求交運算(setoperationtypetointersection())得出半個圓柱的隱函式表示cuted_cylinder,如果是求和運算則用setoperationtypetounion()。

37~42行定義了乙個vtkclippolydata物件clipper,將其輸入設定為18~24行建立的球,裁剪函式設定為圓柱cylinder,接下來的三行40~42行似乎沒有什麼用處。

上面得到的只是用乙個圓柱裁剪球的效果,但是為了同時顯示用半個圓柱裁剪的效果,將剛才的裁剪體演x軸移動一定位置,然後用剛才bool運算獲得的半個圓柱進行裁剪,以便於比較。對幾何物件的移動需要指定乙個變換transform,然後定義乙個vtktransformpolydatafilter物件filter,然後將filter的輸入設定為要移動的幾何物件,變換設定為transform。44~48行實現了將裁剪球的移動,其移動結果在filter中。

49~54行將移動後得到的filter作為新一次裁剪的輸入,以半個圓柱cuted_cylinder為裁剪函式進行裁剪,得到裁剪結果clipper2

接下來的就是設定map,actor等常規物件了,在vtk不必細說了吧,

vtk中資料集

點或單元的屬性資料是以資料陣列 vtkdataarray 的形式進行儲存的,根據資料值型別的不同,具體儲存在vtkdataarray的子類中,如vtkfloatarray和vtkintarray等。陣列中每個元素為元組,對應著單個點或單元的屬性資料。元組個數不指定時,insert的方法插入資料 最終...

關於流水線中剪裁的疑問

如上圖可見,剪裁位於vs之後,setup之前。其中setup是圖元裝配,就是利用三角形索引資訊將頂點組織起來,也就是讓顯示卡知道頂點如何組成三角形。這裡的剪裁應該是視錐的前後面裁剪,是硬體進行的,因為這個剪裁是在三角形組裝之前,沒有三角形的資訊,只有零散的頂點,這時候不可能進行精確到三角面的裁剪,應...

iOS UIImage的剪裁 合併實現

原理 1 建立乙個輸出大小的dc 2 計算應該繪製的位置 3 得到dc區域的uiimage uiimage imagefromimage uiimage image inrect cgrect rect 得到原圖右邊某區域 uiimage getimagefromimage uiimage imag...