高效绘制矢量场,使用Vtk,避免过多的循环

2024-06-08 11:17:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我在想象一些流体运动。我有一个点场,每个点都和一个速度和加速度向量相连。这个问题是关于我的代码是否可以改进,速度方面,因为我试图将它可视化为一个动画,对于更大的字段,这需要相当长的时间,这对于如何设置代码是显而易见的。有很多重复性的工作,在我看来,应该可以更有效地执行,我只是不知道怎么做。你知道吗

工作示例:

import vtk
import numpy as np

renderer = vtk.vtkRenderer()
renderer.SetBackground(0.5, 0.5, 0.5)
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)

lut = vtk.vtkLookupTable()
lutNum = 2560
lut.SetNumberOfTableValues(lutNum)
ctf = vtk.vtkColorTransferFunction()
ctf.SetColorSpaceToDiverging()
ctf.AddRGBPoint(0.0, 0, 0, 1.0)
ctf.AddRGBPoint(1.0, 1.0, 0, 0)
for ii, xx in enumerate(range(lutNum)):
    ss = float(xx) / float(lutNum)
    cc = ctf.GetColor(ss)
    lut.SetTableValue(ii, cc[0], cc[1], cc[2], 1.0) 
lut.SetRampToLinear()
lut.SetVectorModeToMagnitude()

xx = np.arange(-7, 7, 1)
yy = np.arange(-7, 7, 1)
zz = np.arange(-40, 0, 1)

no_datapts = len(xx) * len(yy) * len(zz)

renderWindowInteractor.Initialize()

points = vtk.vtkPoints()
vel = vtk.vtkFloatArray()
vel.SetNumberOfComponents(3)
vel.SetNumberOfTuples(no_datapts)
acc = vtk.vtkFloatArray()
acc.SetNumberOfComponents(3)
acc.SetNumberOfTuples(no_datapts)
index = 0
for idx, x in enumerate(xx):
    for y in yy:
        for idz, z in enumerate(zz):
            points.InsertPoint(index, x, y, z)
            acc_x = 2 * z + 0.1 * x
            acc_z = 1.2 * z + 0.2 * x
            vel_x = 0.5 * z + 0.7 * x
            vel_z = 0.7 * z + 0.3 * x
            acc.SetTuple3(index, acc_x, 0, acc_z)
            vel.SetTuple3(index, vel_x, 0, vel_z)
            index += 1

grid = vtk.vtkStructuredGrid()
grid.SetPoints(points)
grid.GetPointData().SetVectors(vel)

arrow = vtk.vtkArrowSource()
arrow.SetTipResolution(16)
arrow.SetTipLength(0.3)
arrow.SetTipRadius(0.1)

glyph = vtk.vtkGlyph3D()
glyph.SetInputData(grid)
glyph.SetSourceConnection(arrow.GetOutputPort())
glyph.SetVectorModeToUseVector()
glyph.SetColorModeToColorByVector()
glyph.OrientOn()
glyph.Update()

mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(glyph.GetOutputPort())
mapper.SetLookupTable(lut)
mapper.ScalarVisibilityOn()
mapper.SetScalarModeToUsePointData()
mapper.SetScalarRange(grid.GetPointData().GetVectors().GetRange(-1))

actor = vtk.vtkActor()
actor.SetMapper(mapper)
renderer.AddActor(actor)
renderWindow.Render()
renderWindowInteractor.Start()

这应该是工作,我已经包括了一些颜色和东西,以及,即使不是真的必要的例子,但为什么不。你知道吗

有趣的是,我有一个三维网格,它基本上只是一个二维的x-z网格,用多个y位置来表示。你知道吗

这就是问题所在。有没有什么方法可以通过创建不同的结构化网格来避免这种三重循环?我必须单独设置点和元组吗?你知道吗

我希望这个问题很清楚,如果你觉得不清楚,如果我自己找到不同的解决方案,我当然会更新这个问题。你知道吗

如果您能提供任何帮助,我将不胜感激。你知道吗


Tags: indexnpgridctfrendereraccmapperxx