2017-04-19 145 views
0

我想定義一個三維框的特定大小和位置旁邊的給定三角形幾何ParaView Clip/Slice,Box參數:位置,旋轉,縮放的含義;在Matlab中重建框

因此,我在ParaView中打開幾何網格。然後,我使用「盒子」類型的剪輯(或切片)。通過這種方式,我可以獲得一個可以通過鼠標快速交互式移動,旋轉和調整大小的框的ParaView 3D小部件

屬性面板總是顯示我箱參數

  • 位置
  • 旋轉
  • 規模

到目前爲止好,但我該如何使用這些在ParaView外部使用這個框的值,例如在MATLAB中?盒子的實際座標是什麼?

Ventricle Placement Below Atria

回答

0

我們複製框屬性出paraview包的:

box = struct(); 
box.translate = [-274.8975, -114.0316, -333.6671]; 
box.rotate = [27.066, 119.62, -175.472]; 
box.scale  = [1.031, 0.663, 1.2233]; 

箱尺寸是相對於剪輯過濾器上定義的幾何尺寸。因此,首先獲取幾何的範圍,其頂點存儲在surfpts中。

surfpts = ...; % [nPoints x 3] 
mn = min(surfpts,[],1); 
mx = max(surfpts,[],1); 

在這個例子中,我想填充一個網格點的框。

box.xyz = arrayfun(@(a,b) linspace(a,b,n)', mn, mx, 'UniformOutput',false); 
box.xyz = cell2mat(box.xyz); 
[X,Y,Z] = ndgrid(box.xyz(:,1), box.xyz(:,2), box.xyz(:,3)); 
box.XYZ = [X(:), Y(:), Z(:)]; 

現在我們要根據我們做的盒子的Paraview 3D插件的動作來縮放,旋轉和平移我們的網格(順序!)。

% Scaling 
box.XYZ = bsxfun(@times, box.XYZ, box.scale); 
% Rotation 
box.XYZ = (rotz(box.rotate(3)) * rotx(box.rotate(1)) * roty(box.rotate(2)) * box.XYZ')'; 
% Translation 
box.XYZ = bsxfun(@plus, box.XYZ, box.translate); 

最後,我們通過在ParaView中再次打開創建的框來檢查結果。它與盒子完全匹配。

TR = delaunayTriangulation(box.XYZ); 
[box_tri, box_pts] = TR.freeBoundary(); 
vtkwrite('tmp_box.vtk','polydata','triangle',box_pts(:,1),box_pts(:,2),box_pts(:,3),box_tri)