2017-11-30 3 views
0

2次元グリッド上のイメージングユニットの3ベクトルデータです。ベクトルはデカルトである。私はこれらのベクトルを平面上の矢印の全長の中央点を中心とする3dの矢印として表示したいと思います。私の考えは、 - (vector/2)に等しい翻訳の別の行列を作成し、グリフを移動する(または各ベクトルの原点を変更するなど)。私は、グリフへの翻訳としてこれらの新しいベクトルをポイントワイズに適用したいと考えました。私は失敗し、助けが必要です。すべてのVTKグリフを大きなデータセットで個別に翻訳

翻訳では、ベクトルの大きさを維持する必要があります。おそらくこれを行う他の方法はありますか?私はMayavi2がチェックボタンでこれを行うことができますが、私が必要とする他の機能は持っていないことに注意してください。

私は今週、PythonとVTKを使用し始めたことに言及する必要がありますので、コード内の愚痴を指摘してください。作業コード:

import vtk 
import math 
import sys #Just to break flow 

# The source file 
file_name = "Stable.vts" 

# Read the source file. 
reader = vtk.vtkXMLStructuredGridReader() 
reader.SetFileName(file_name) 
reader.Update() 
output = reader.GetOutput() 
numPoints = output.GetNumberOfPoints() 
dimensions = output.GetDimensions() 

#Tuple to hold spherical polar coords 
mpolar = vtk.vtkFloatArray() 
mpolar.SetNumberOfTuples(numPoints) 
mpolar.SetNumberOfComponents(3) 
mpolar.SetNumberOfValues(3*numPoints) 
mpolar.SetName("mpolar") 

#Tuple to hold translations 
mtrans = vtk.vtkFloatArray() 
mtrans.SetNumberOfTuples(numPoints) 
mtrans.SetNumberOfComponents(3) 
mtrans.SetNumberOfValues(3*numPoints) 
mtrans.SetName("mtrans") 

#Tuple copy of cartesian data 
mxyz = vtk.vtkFloatArray() 
mxyz = output.GetPointData().GetAbstractArray(0) 
mxyz.SetName("mxyz") 

#Loop through input data and convert to spherical polar 
#Also set points equal to input points 
#Also create vector transform for each vector 
for x in range(numPoints): 
    azi = math.atan2(output.GetPointData().GetAbstractArray(0).GetTuple(x)[0],output.GetPointData().GetAbstractArray(0).GetTuple(x)[1]) 
    pol = math.acos(output.GetPointData().GetAbstractArray(0).GetTuple(x)[2]) 
    rad = 1 
    mpolar.SetTuple3(x, azi, pol, rad) 
    mtrans.SetTuple3(x, -output.GetPointData().GetAbstractArray(0).GetTuple(x)[0]/2, \ 
     -output.GetPointData().GetAbstractArray(0).GetTuple(x)[1]/2, \ 
     -output.GetPointData().GetAbstractArray(0).GetTuple(x)[2]/2) 

#Define new structured grid 
skrGrid = vtk.vtkStructuredGrid() 
skrGrid.SetDimensions(dimensions) 
skrGrid.SetPoints(output.GetPoints()) 
skrGrid.GetPointData().AddArray(mpolar) 
skrGrid.GetPointData().AddArray(mxyz) 
skrGrid.GetPointData().AddArray(mtrans) 

#Write new structured grid 
#writer = vtk.vtkXMLStructuredGridWriter() 
#writer.SetFileName("skrGrid.vts") 
#writer.SetInputData(skrGrid) 
#writer.Write() 

#Subsample grid 
subs = 11 
extract = vtk.vtkExtractGrid() 
extract.SetInputData(skrGrid) 
extract.SetSampleRate(subs, subs, 1) 
extract.Update() 
#extract.IncludeBoundaryOn() #Get boundary even if not sampled 

#Cast data into PolyData format for Glyphs 
pd = vtk.vtkPolyData() 
pd.SetPoints(extract.GetOutput().GetPoints()) 
pd.GetPointData().SetVectors(extract.GetOutput().GetPointData().GetAbstractArray(1)) 

arrowSource = vtk.vtkArrowSource() 

glyph3D = vtk.vtkGlyph3D() 
glyph3D.SetSourceConnection(arrowSource.GetOutputPort()) 
glyph3D.SetVectorModeToUseVector() 
glyph3D.SetInputData(pd) 
glyph3D.SetScaleFactor(1e-07) 
glyph3D.Update() 

# Create a mapper and actor 
mapper = vtk.vtkPolyDataMapper() 
mapper.SetInputConnection(glyph3D.GetOutputPort()) 

actor = vtk.vtkActor() 
actor.SetMapper(mapper) 

# Visualize 
camera = vtk.vtkCamera() 
camera.SetPosition(5e-07, -15e-07, 1e-06) 
camera.SetFocalPoint(5e-07, 5e-07, 0) 

# Create a renderer, render window, and interactor 
renderer = vtk.vtkRenderer() 
renderer.SetActiveCamera(camera) 

renderWindow = vtk.vtkRenderWindow() 
renderWindow.AddRenderer(renderer) 
renderWindowInteractor = vtk.vtkRenderWindowInteractor() 
renderWindowInteractor.SetRenderWindow(renderWindow) 

# Add the actor to the scene 
renderer.AddActor(actor) 
renderer.SetBackground(1, 1, 1) # Background color white 
renderer.ResetCameraClippingRange() # Call because without it you need window input to make render display! 

# enable user interface interactor 
# Render and interact 
renderWindow.SetSize(800,600) 
renderWindowInteractor.Initialize() 
renderWindow.Render() 
renderWindowInteractor.Start()  
+0

'Stable.vts'を共有することはできますか? –

+0

データセットが大きすぎますが、2次元格子点に(0.49766603112220764、-0.8000770807266235,0.349705636501312)のような3つのベクトルが付いています。 – Charlie

答えて

0

ここで必要なのはワープベクトルです。変位がすでにmtransとして計算されているので、これらの変位は新しい構成に歪ませるために点集合に適用することができます。ポイントセットは、グリフの原点です。以下は、サブサンプルグリッドの下のコードセクションです。

#Cast data into PolyData format for warping 
pd = vtk.vtkPolyData() 
pd.SetPoints(extract.GetOutput().GetPoints()) 
pd.GetPointData().SetVectors(extract.GetOutput().GetPointData().GetAbstractArray(2)) 

#Warp vector origins 
warpVector = vtk.vtkWarpVector() 
warpVector.SetInputData(pd) 
warpVector.SetScaleFactor(1e-07) 
warpVector.Update() 

#Cast warped points and original vectors into PolyData for rendering 
warped = vtk.vtkPolyData() 
warped.SetPoints(warpVector.GetOutput().GetPoints()) 
warped.GetPointData().SetVectors(extract.GetOutput().GetPointData().GetAbstractArray(1)) 

arrowSource = vtk.vtkArrowSource() 

glyph3D = vtk.vtkGlyph3D() 
glyph3D.SetSourceConnection(arrowSource.GetOutputPort()) 
glyph3D.SetVectorModeToUseVector() 
glyph3D.SetInputData(warped) 
glyph3D.SetScaleFactor(1e-07) 
glyph3D.Update() 
関連する問題