在vtk中,我們通常需要的並不是嚴格標準的幾何體,我們需要對這些幾何體進行加工,修改其內容,得到我們想要的效果,下面結合例子介紹如何在vtk中實現對幾何體的裁剪。要對幾何體進行裁剪,需要建立好幾何體模型,然後定義乙個隱函式,利用vtkclippolydata,通過隱函式vtkimplicitfunction實現對模型的裁剪,在vtk中,類似vtkplane,vtksphere,vtkcylinder這些後面沒有source的類,都是隱函式類。
其中1~14行包含相應標頭檔案#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()
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...