PointInterpolator - ImageData
Description
利用PointInterpolator插值生成三维栅格数据。属性值受空间位置(x,y,z)影响。
生成插值网格体
res = 40
# Create a probe volume
center = output.GetCenter()
bounds = output.GetBounds()
length = output.GetLength()
probe = vtk.vtkImageData()
# 设置三个维度40*40*40
probe.SetDimensions(res,res,res)
# (xmin,ymin,zmin)设置左下角起点值
probe.SetOrigin(bounds[0],bounds[2],bounds[4])
# (dx,dy,dz)设置网格三个维度的间隔
probe.SetSpacing((bounds[1]-bounds[0])/(res-1),
(bounds[3]-bounds[2])/(res-1),
(bounds[5]-bounds[4])/(res-1))
构建插值对象
# Reuse the locator 定位器
locator = vtk.vtkStaticPointLocator()
locator.SetDataSet(output)
locator.BuildLocator()
# Use a gaussian kernel高斯核函数
gaussianKernel = vtk.vtkGaussianKernel()
gaussianKernel.SetRadius(0.5)
gaussianKernel.SetSharpness(4)
print ("Radius: {0}".format(gaussianKernel.GetRadius()))
interpolator = vtk.vtkPointInterpolator()
# 点集P Values from Pc onto P
interpolator.SetInputData(probe)
# 点云Pc
interpolator.SetSourceData(output)
interpolator.SetKernel(gaussianKernel)
interpolator.SetLocator(locator)
interpolator.SetNullPointsStrategyToClosestPoint()
ImageData 数据的写
vtkXMLImageDataWriter 将vtkImageData写入XML文件,扩展名*.vti。
vtkStructuredPointsWriter将vtkImageData写入ASCII文本文件,扩展名*.vtk。
# write1
filename = "writeImageData.vti"
writer=vtk.vtkXMLImageDataWriter()
writer.SetFileName(filename)
writer.SetInputData(interpolator.GetOutput())
writer.Write()
# write2
filename = "writeImageData.vtk"
writer=vtk.vtkStructuredPointsWriter()
writer.SetFileName(filename)
writer.SetInputData(interpolator.GetOutput())
writer.Write()
All Code
#!/usr/bin/env python
import vtk
from vtk.util.misc import vtkGetDataRoot
VTK_DATA_ROOT = vtkGetDataRoot()
VTK_DATA_ROOT = "D:/codelearnning/vtk/VTK_BUILD/ExternalData/Testing/"
# Interpolate onto a volume
# Parameters for debugging
res = 40
# create pipeline
#
extent = [0,56, 0,32, 0,24]
pl3d = vtk.vtkMultiBlockPLOT3DReader()
pl3d.SetXYZFileName(VTK_DATA_ROOT + "/Data/combxyz.bin")
pl3d.SetQFileName(VTK_DATA_ROOT + "/Data/combq.bin")
pl3d.SetScalarFunctionNumber(100)
pl3d.SetVectorFunctionNumber(202)
pl3d.Update()
output = pl3d.GetOutput().GetBlock(0)
# Create a probe volume
center = output.GetCenter()
bounds = output.GetBounds()
length = output.GetLength()
probe = vtk.vtkImageData()
probe.SetDimensions(res,res,res)
# xmin,ymin,zmin
probe.SetOrigin(bounds[0],bounds[2],bounds[4])
# dx,dy,dz
probe.SetSpacing((bounds[1]-bounds[0])/(res-1),
(bounds[3]-bounds[2])/(res-1),
(bounds[5]-bounds[4])/(res-1))
# Reuse the locator
locator = vtk.vtkStaticPointLocator()
locator.SetDataSet(output)
locator.BuildLocator()
# Use a gaussian kernel------------------------------------------------
gaussianKernel = vtk.vtkGaussianKernel()
gaussianKernel.SetRadius(0.5)
gaussianKernel.SetSharpness(4)
print ("Radius: {0}".format(gaussianKernel.GetRadius()))
interpolator = vtk.vtkPointInterpolator()
interpolator.SetInputData(probe)
interpolator.SetSourceData(output)
interpolator.SetKernel(gaussianKernel)
interpolator.SetLocator(locator)
interpolator.SetNullPointsStrategyToClosestPoint()
# Time execution
timer = vtk.vtkTimerLog()
timer.StartTimer()
interpolator.Update()
timer.StopTimer()
time = timer.GetElapsedTime()
print("Interpolate Points (Volume probe): {0}".format(time))
intMapper = vtk.vtkDataSetMapper()
intMapper.SetInputConnection(interpolator.GetOutputPort())
intActor = vtk.vtkActor()
intActor.SetMapper(intMapper)
# Create an outline
outline = vtk.vtkStructuredGridOutlineFilter()
outline.SetInputData(output)
outlineMapper = vtk.vtkPolyDataMapper()
outlineMapper.SetInputConnection(outline.GetOutputPort())
outlineActor = vtk.vtkActor()
outlineActor.SetMapper(outlineMapper)
# write1
filename = "writeImageData.vti"
writer=vtk.vtkXMLImageDataWriter()
writer.SetFileName(filename)
writer.SetInputData(interpolator.GetOutput())
writer.Write()
# write2
filename = "writeImageData.vtk"
writer=vtk.vtkStructuredPointsWriter()
writer.SetFileName(filename)
writer.SetInputData(interpolator.GetOutput())
writer.Write()
# Create the RenderWindow, Renderer and both Actors
#
ren0 = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.SetMultiSamples(0)
renWin.AddRenderer(ren0)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
# Add the actors to the renderer, set the background and size
#
ren0.AddActor(intActor)
ren0.AddActor(outlineActor)
ren0.SetBackground(0.1, 0.2, 0.4)
renWin.SetSize(250,250)
cam = ren0.GetActiveCamera()
cam.SetClippingRange(3.95297, 50)
cam.SetFocalPoint(8.88908, 0.595038, 29.3342)
cam.SetPosition(-12.3332, 31.7479, 41.2387)
cam.SetViewUp(0.060772, -0.319905, 0.945498)
iren.Initialize()
# render the image
#
renWin.Render()
iren.Start()
Result
面模式和线框模式