VTK Learning Twenty-six- PointInterpolator Two

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

面模式和线框模式
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值