• 科学计算三维可视化---TVTK库可视化实例


    一:TVTK库可视化实例

    Plot3D文件知识:PLOT3D 数据格式

    PLOT3D文件分为网格文件(XYZ 文件), 空气动力学结果文件 (Q 文件)和通用结果文件(函数文件 + 函数名称文件)。网格文件中可加入所谓的IBlank参数。

    (一)标量数据可视化(等值面)

    generate_values()创建等值面

    from tvtk.api import tvtk
    from Tvtkfunc import ivtk_scene,event_loop
    
    def read_data():    #导入数据
        plot3d = tvtk.MultiBlockPLOT3DReader(
            xyz_file_name="comxyz.bin", #网格文件
            q_file_name="combq.bin", #开启动力学结果文件
            scalar_function_number = 100, #设置标量数据数量
            vector_function_number=200, #设置矢量数据数量
        )   #读入Plot3D数据
        plot3d.update() #让plot3D计算器输出数据
        return plot3d
    
    plot3d = read_data()
    grid = plot3d.output.get_block(0)   #获取读入的数据集对象
    
    con = tvtk.ContourFilter()  #创建等值面对象
    con.set_input_data(grid)    #将网格与其绑定
    con.generate_values(10,grid.point_data.scalars.range) #指定轮廓数和数据范围 其中轮廓数越大,越丰富多彩  #映射颜色最小红色,最大蓝色
    
    m = tvtk.PolyDataMapper(scalar_range=grid.point_data.scalars.range, #设置映射器的变量范围属性
                            input_connection=con.output_port)
    a = tvtk.Actor(mapper=m)
    a.property.opacity = 0.5    #设置透明度为0.5
    
    win = ivtk_scene(a)
    win.scene.isometric_view()
    event_loop()

    set_value设置每个等值面的值

    第一个参数是指定第几个等值面,第二个参数是设置该等值面的值
    set_value(0,0.3)

    (二)矢量数据可视化(有数值和方向)

    箭头大小可以表示标量信息,箭头方向可以表示矢量的方向
    为了能够在矢量数据网格中放置箭头符号,我们可以使用TVTK库中提供的Glyph3D符号化技术,可以产生放缩,着色,和具有方向的符号

    在一般情况下,由于矢量数据过于密集,为了使得绘制速度更快,让箭头的密度适中,我们可以使用降维的方法,来降低数据的密度

    from tvtk.api import tvtk
    from Tvtkfunc import ivtk_scene,event_loop
    
    def read_data():    #导入数据
        plot3d = tvtk.MultiBlockPLOT3DReader(
            xyz_file_name="comxyz.bin", #网格文件
            q_file_name="combq.bin", #开启动力学结果文件
            scalar_function_number = 100, #设置标量数据数量
            vector_function_number=200, #设置矢量数据数量
        )   #读入Plot3D数据
        plot3d.update() #让plot3D计算器输出数据
        return plot3d
    
    
    plot3d = read_data()
    grid = plot3d.output.get_block(0)   #获取读入的数据集对象
    
    #对数据集中的数据进行随机选取,每50个点选择一个点,是对数据进行降采样
    mask = tvtk.MaskPoints(random_mode=True,on_ratio=50)
    mask.set_input_data(grid)   #将grid和mask相连
    #创建表示箭头的PolyData数据集
    glyph_source = tvtk.ArrowSource()
    #在Mask采样后的PolyData数据集每个点上放置一个箭头
    #箭头的方向(速度方向),长度<箭头越大,表示标量越大>和颜色<也表示标量大小,红色小,蓝色大>(两个都表示密度)由于点对应的矢量和标量数据决定
    
    #将上面的降采样数据与箭头符号化相关联
    glyph
    = tvtk.Glyph3D(input_connection=mask.output_port, scale_factor=4) #scale_factor符号的共同放缩系数 glyph.set_source_connection(glyph_source.output_port) m = tvtk.PolyDataMapper(scalar_range=grid.point_data.scalars.range, #设置映射器的变量范围属性 input_connection=glyph.output_port) a = tvtk.Actor(mapper=m) a.property.opacity = 0.5 #设置透明度为0.5 win = ivtk_scene(a) win.scene.isometric_view() event_loop()

    总结矢量化数据可视化的三个方法

    (1)Glyph3D是TVTK的符号化技术

    降采样的数据会被传入作为他的数据源,他输入数据的每个点,都会拷贝一个符号,符号本身是通过ArrowSource创建,由set_source_connection关联ployData和箭头

    (2)MaskPoints降采样,可输出降采样前后点的数目查看效果

    降采样前

    降采样后

    (3)ArrowSource方法修改

    创建了表示箭头的PolyData数据集
    glyph_source = tvtk.ArrowSource()  
    glyph_source = tvtk.ConeSource()
    设置防缩系数:scale_factor = 2

    (三)空间轮廓线可视化

    from tvtk.api import tvtk
    from tvtk.common import configure_input
    from Tvtkfunc import ivtk_scene,event_loop
    
    def read_data():    #导入数据
        plot3d = tvtk.MultiBlockPLOT3DReader(
            xyz_file_name="comxyz.bin", #网格文件
            q_file_name="combq.bin", #开启动力学结果文件
            scalar_function_number = 100, #设置标量数据数量
            vector_function_number=200, #设置矢量数据数量
        )   #读入Plot3D数据
        plot3d.update() #让plot3D计算器输出数据
        return plot3d
    
    
    plot3d = read_data()
    grid = plot3d.output.get_block(0)   #获取读入的数据集对象
    
    outline = tvtk.StructuredGridOutlineFilter()    #计算表示外边框的PolyData对象
    configure_input(outline,grid)   #调用tvtk.common.configure_input(),将外框计算与数据集产生关联
    
    m = tvtk.PolyDataMapper(input_connection=outline.output_port)
    a = tvtk.Actor(mapper=m)
    a.property.color = 0.3,0.3,0.3  #float色彩空间0-1.0
    
    win = ivtk_scene(a)
    win.scene.isometric_view()
    event_loop()

    思路扩展:

    将空间轮廓可视化和标量数据可视化或者矢量数据可视化一起使用,形成更加完善的形状
  • 相关阅读:
    Android 模拟系统事件(三)
    全民Scheme(2):来自星星的你
    Java经典23种设计模式之行为型模式(三)
    libmysqld,嵌入式MySQLserver库
    闲云控制台(一)控制台命令解析框架
    怎样改动android系统字体大小
    [多校2015.02.1006 高斯消元] hdu 5305 Friends
    换工作经历和心得
    安卓实训第七天---多线程下载实现(进度条)
    校园双选会,你都懂么
  • 原文地址:https://www.cnblogs.com/ssyfj/p/9302024.html
Copyright © 2020-2023  润新知