学习笔记二

一、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对象,它的属性包括但不限于以下几个:

  1. SetTotalLength(double, double, double):设置坐标轴的总长度。
  2. SetShaftType(int):设置坐标轴的轴线类型。
  3. SetTipType(int):设置坐标轴的箭头类型。
  4. SetCylinderRadius(double):设置坐标轴的圆柱体半径。
  5. SetAxisLabels(int):设置坐标轴是否显示标签。
  6. SetXAxisLabelText(const char*):设置X轴标签的文本。
  7. SetYAxisLabelText(const char*):设置Y轴标签的文本。
  8. SetZAxisLabelText(const char*):设置Z轴标签的文本。
  9. SetAxisLabelFont(vtkTextProperty*):设置坐标轴标签的字体属性。
  10. SetAxisLabelVisibility(int):设置坐标轴标签是否可见。
  11. SetAxisLabelColor(double, double, double):设置坐标轴标签的颜色。
  12. SetAxisLineWidth(int):设置坐标轴线的宽度。
  13. SetNormalizedShaftLength(double, double, double):设置坐标轴轴线的长度。
  14. SetNormalizedTipLength(double, double, double):设置坐标轴箭头的长度。
  15. SetNormalizedLabelPosition(double, double, double):设置坐标轴标签的位置。
  16. SetLabelScale(double):设置坐标轴标签的缩放比例。
  17. 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();

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值