一、GetScalarRange()获取tkStructuredGrid数据中的标量数据范围
import vtk
# 创建一个vtkStructuredGrid对象
structuredGrid = vtk.vtkStructuredGrid()
# 加载数据或生成数据...
# ...
# 获取标量数据范围
scalarRange = structuredGrid.GetScalarRange()
minimum = scalarRange[0]
maximum = scalarRange[1]
print("标量数据范围:", minimum, maximum)
二、将包含xyz坐标和浓度值的体数据创建为vtkStructuredGrid数据
例1
创建vtkStructuredGrid对象
grid = vtk.vtkStructuredGrid()
# 设置维度尺寸
gird.SetDimensions(10,10,10)
# 添加数据点
points = vtk.vtkPoints()
for i in range(10):
for j in range(10):
for k in range(10):
x = i / 10.0
y = j / 10.0
z = k / 10.0
points.InsertNextPoint(x, y, z)
grid.SetPoints(points)
# 添加浓度值
data_array = vtk.vtkFloatArray()
data_array.SetNumberOfComponents(1)
data_array.SetName('data')
for i in range(dim_x * dim_y * dim_z):
data_array.InsertNextValue(i)
grid.GetPointData().AddArray(data_array)
例2
# 生成数据
grid_size = 10
x, y, z = np.mgrid[-grid_size:grid_size+1, -grid_size:grid_size+1, -grid_size:grid_size+1]
data = x**2 + y**2 + z**2 #浓度值
# 创建vtk数据对象vtkStructuredGrid并设置其属性,包括维度尺寸、点坐标和对应的浓度值
points = vtk.vtkPoints()
grid = vtk.vtkStructuredGrid()
grid.SetDimensions(data.shape) #设置各维度尺寸
for k in range(data.shape[2]):
for j in range(data.shape[1]):
for i in range(data.shape[0]):
points.InsertNextPoint(i, j, k) #xyz 将(-10,-10,-10)(-9,-10,-10)
# (-8,-10,-10)......(10,10,10)等共21^3=9261个点加入points
grid.SetPoints(points) #设置点坐标
values = vtk.vtkDoubleArray()
values.SetNumberOfValues(data.size)
for i in range(data.size):
values.SetValue(i, data.flat[i])
grid.GetPointData().SetScalars(values) #设置各点浓度
三、用提取等值面的方法对vtkStructuredGrid数据实现可视化
import vtk
import numpy as np
# 生成数据
grid_size = 10
x, y, z = np.mgrid[-grid_size:grid_size+1, -grid_size:grid_size+1, -grid_size:grid_size+1]
data = x**2 + y**2 + z**2 #浓度值
# 创建vtk数据对象vtkStructuredGrid并设置其属性,包括维度尺寸、点坐标和对应的浓度值
points = vtk.vtkPoints()
grid = vtk.vtkStructuredGrid()
grid.SetDimensions(data.shape) #设置各维度尺寸
for k in range(data.shape[2]):
for j in range(data.shape[1]):
for i in range(data.shape[0]):
points.InsertNextPoint(i, j, k) #xyz 将(-10,-10,-10)(-9,-10,-10)
# (-8,-10,-10)......(10,10,10)等共21^3=9261个点加入points
grid.SetPoints(points) #设置点坐标
values = vtk.vtkDoubleArray()
values.SetNumberOfValues(data.size)
for i in range(data.size):
values.SetValue(i, data.flat[i])
grid.GetPointData().SetScalars(values) #设置各点浓度
# 对vtkStructuredGrid进行插值或者平滑等预处理操作
# 使用vtkContourFilter算法或MarchingCubes算法从vtkStructuredGrid中提取等值面
#iso = vtk.vtkMarchingCubes()
#iso.SetInputData(grid) 需注意,Mc算法中数据输入必须是ImageData数据类型
#iso.ComputeNormalsOn()
contour = vtk.vtkContourFilter()
contour.SetInputData(grid)
contour.GenerateValues(10, grid.GetScalarRange()) #设置等值面数量和范围
# 对提取的等值面进行后处理操作,例如剖分三角形和去除孤立点
clean = vtk.vtkCleanPolyData()
clean.SetInputConnection(contour.GetOutputPort())
# 渲染和显示等值面
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(contour.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
renderer = vtk.vtkRenderer()
renderer.AddActor(actor)
renderer.SetBackground(0, 0, 0)
render_window = vtk.vtkRenderWindow()
render_window.SetSize(600, 600)
render_window.AddRenderer(renderer)
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(render_window)
render_window.Render()
interactor.Start()
四、体绘制算法比较
VTK中不同的vtkVolumeMapper支持不同的数据类型。
vtkVolumeRayCastMapper和vtkVolumeTextureMapper2D仅支持VTK_UNSIGNED_CHAR 和VTK_UNSIGNED_SHORT类型数据。当涉及到其他类型数据时,需要做数据强制转换,可以考虑使用vtkImageCast或vtkImageShiftScale类。
vtkVolumeTextureMapper3D则支持任意类型数据,当然必须输单组分数据或者是多元独立数据。
VTKFixedPointVolumeRayCastMapper灵活性最高,支持所有类型数据,最该可以支持四元数据
五、axesActor是一个vtkAxesActor对象,它的属性包括但不限于以下几个:
- SetTotalLength(double, double, double):设置坐标轴的总长度。
- SetShaftType(int):设置坐标轴的轴线类型。
- SetTipType(int):设置坐标轴的箭头类型。
- SetCylinderRadius(double):设置坐标轴的圆柱体半径。
- SetAxisLabels(int):设置坐标轴是否显示标签。
- SetXAxisLabelText(const char*):设置X轴标签的文本。
- SetYAxisLabelText(const char*):设置Y轴标签的文本。
- SetZAxisLabelText(const char*):设置Z轴标签的文本。
- SetAxisLabelFont(vtkTextProperty*):设置坐标轴标签的字体属性。
- SetAxisLabelVisibility(int):设置坐标轴标签是否可见。
- SetAxisLabelColor(double, double, double):设置坐标轴标签的颜色。
- SetAxisLineWidth(int):设置坐标轴线的宽度。
- SetNormalizedShaftLength(double, double, double):设置坐标轴轴线的长度。
- SetNormalizedTipLength(double, double, double):设置坐标轴箭头的长度。
- SetNormalizedLabelPosition(double, double, double):设置坐标轴标签的位置。
- SetLabelScale(double):设置坐标轴标签的缩放比例。
- SetCamera(vtkCamera*):设置坐标轴的相机。
六、vtkLookupTable
//定义颜色映射表
vtkLookupTable* pColorTable = vtkLookupTable::New();
//设置颜色表中的颜色,下列两种方式都可以
/*
pColorTable->SetNumberOfColors(4);
pColorTable->SetTableValue(0,1.0,0.0,0.0,1.0);
pColorTable->SetTableValue(0,1.0,0.0,0.0,1.0);
pColorTable->SetTableValue(1,0.0,1.0,0.0,1.0);
pColorTable->SetTableValue(2,1.0,1.0,0.0,1.0);
pColorTable->SetTableValue(3,0.0,0.0,1.0,1.0);
*/
//设置颜色表中的颜色
pColorTable->SetNumberOfColors(256);
pColorTable->SetHueRange(0.67, 0.0); //色调范围从红色到蓝色
pColorTable->Build();