我在图像单元3矢量数据的二维网格点。向量是笛卡尔坐标。我想把这些矢量显示为以平面上箭头总长度的中点为中心的三维箭头。我的想法是创建另一个平移矩阵,等于-(vector/2),然后移动glyph(或更改每个向量原点或任何可行的方法)!因此,我想将这些新的矢量逐点应用到字形上。我失败了,需要帮助。在
平移需要保持矢量的大小。也许还有其他方法可以做到这一点。我注意到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()
这里需要的是一个扭曲向量。由于位移已经被计算为mtrans,因此可以将其应用于点集,以便将其扭曲到新的配置。点集是图示符的原点。下面是子示例网格下面的一段代码。在
相关问题 更多 >
编程相关推荐